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 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100