Laravel尝试/抓住不起作用

时间:2018-08-14 14:43:39

标签: php laravel laravel-5 error-handling try-catch

我搜索了几个问题,原因是我的代码不是 正确抛出错误,但我无法弄清楚。

我的控制器中具有以下功能

<?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);
    }
}

作为参考,我正在使用软删除。没问题,我可以暂停资源。如果我尝试暂停已被暂停的硬盘,那么Laravel会正确地抛出500,正如我在日志文件/storage/logs/laravel.log

中看到的那样

这是我看到的错误的一部分;

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

不使用 withTrashed()在查询中,很明显找不到行。所以这很有意义。

太好了...那为什么我的catch却没有真正抓住任何东西?我在浏览器中看到500错误,但是我的应用程序应该允许我继续并正确处理该错误。但这只是完全崩溃了...

下面是respond_with_error函数。我已经尝试在测试中将$code更改为200,但这并没有任何改变。我已经测试过返回一个简单的字符串而不是使用此函数无济于事,所以我认为这部分没有任何问题。

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

我正在运行Laravel 5.6.29

1 个答案:

答案 0 :(得分:2)

有两种解决方法。首先要注意的是ERROR: Call to a member function delete() on null并不是一个例外,它是一个致命错误。

  1. 当找不到模型并且可以使用该模型时,可以使用findOrFail而不是find引发异常。

  2. 您还可以捕获Throwable而不是Exception来捕获错误和异常(从PHP7开始),或者仅捕获Error来捕获错误。

  

由于Error层次结构不是从Exception继承的,因此使用catch(Exception $ e){...}块来处理PHP 5中未捕获的异常的代码将发现这些Error没有被这些块捕获。

需要catch(Error $ e){...}块或set_exception_handler()处理程序。

在此处阅读有关PHP7错误处理的更多信息:http://php.net/manual/en/language.errors.php7.php