我搜索了几个问题,是因为我的代码没有正确抛出错误,但我无法理解。
我的控制器中有以下功能
<?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()
,显然无法找到行。所以这是有道理的。
Great...so,为什么我的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);
}
我在运行Laravel5.6.29
发布于 2018-08-14 06:49:22
解决这一问题有两种方法。首先要注意的是,ERROR: Call to a member function delete() on null
不是一个例外,它是一个致命的错误。
findOrFail
而不是find
来抛出异常,这样就可以了。Throwable
而不是Exception
来捕获错误和异常(如PHP7),也可以只捕获Error
来捕获错误。由于错误层次结构不从异常继承,使用catch (异常$e) {.}块在PHP 5中处理未捕获异常的代码将发现这些错误不会被这些块捕获。需要一个catch (错误$e) {.}块或一个set_exception_handler()处理程序。
在这里阅读有关PHP7错误处理的更多信息:http://php.net/manual/en/language.errors.php7.php
https://stackoverflow.com/questions/51844099
复制相似问题