dtgr6303 2018-08-14 14:43
浏览 127
已采纳

Laravel尝试/抓住不工作

I've searched a few questions for a reason my code is not throwing an error correctly, but I can't figure it out.

I have the following function in my controller

<?php
public function suspend($id)
{
    try {
        $this->collection = $this->class::find($id);

        $this->collection->delete();

        return $this->respond_with_success();

    } catch (\Exception $e) {

        return $this->respond_with_error('Failed to suspend resource with id: ' . $id);
    }
}

For reference, I'm using soft deletes. I can suspend a resource once no problem. If I try to suspend one that's already suspended, Laravel correctly throws a 500 as I can see in the log file /storage/logs/laravel.log

This is part of the error I see;

local.ERROR: Call to a member function delete() on null....

Without using withTrashed() in the query, a row quite obviously cannot be found. So this makes sense.

Great...so why does my catch not actually catch anything? I see a 500 error in the browser, but my application should allow me to continue and handle that error correctly. But it just falls over completely...

The respond_with_error function is below. I've tried changing the $code to 200 in testing, but this doesn't change anything. I've tested returning a simple string rather than with this function to no avail, so I don't think there's anything wrong with this part.

<?php
protected function respond_with_error($message = 'error', $code = 500)
{
    return Response::json([
        'success' => false,
        'message' => $message,
    ], $code);
}

I'm running Laravel 5.6.29

  • 写回答

1条回答 默认 最新

  • dtujfmfs06058 2018-08-14 14:49
    关注

    There are two ways to address this. The first thing to note is ERROR: Call to a member function delete() on null is not an exception, it is a fatal error.

    1. You can use findOrFail instead of find to throw an Exception when the model is not found and that will work.

    2. You could also catch Throwable instead of Exception to catch errors and exceptions (as of PHP7) or just Error to catch errors.

    As the Error hierarchy does not inherit from Exception, code that uses catch (Exception $e) { ... } blocks to handle uncaught exceptions in PHP 5 will find that these Errors are not caught by these blocks. Either a catch (Error $e) { ... } block or a set_exception_handler() handler is required.

    Read more on PHP7 Error Handling here: http://php.net/manual/en/language.errors.php7.php

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
  • ¥50 NT4.0系统 STOP:0X0000007B
  • ¥15 想问一下stata17中这段代码哪里有问题呀
  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决