Laravel 5.5 Try / Catch 不起作用,它正在执行异常句柄

Nik*_* K. 2 try-catch laravel laravel-5 laravel-5.5

我正在使用 laravel 5.5 我编写了一个带有 try 和 catch 异常的代码。但是 Try/catch 不是管理异常处理。异常执行Exception/handle.php

这是我正在关注的代码

try {
 App\Models\justDoIt::find(1);
}  catch (\Exception $ex) {
       dd($ex);
       report($ex);
       return false;
}
Run Code Online (Sandbox Code Playgroud)

我想知道为什么不执行 catch 并且从handle.phpin显示错误report()

这是handle.php代码

public function report(Exception $exception) {
        echo "Handle";
        dd($exception);
        parent::report($exception);
    }
Run Code Online (Sandbox Code Playgroud)

结果

Handle
FatalThrowableError {#284 ?
  #message: "Class 'App\Http\Controllers\App\Models\justDoIt' not found"
  #code: 0
  #file: "D:\xampp7\htdocs\homeexpert_nik\app\Http\Controllers\HomeController.php"
  #line: 21
  #severity: E_ERROR
  trace: {?}
}
Run Code Online (Sandbox Code Playgroud)

结果将显示在 handle.php 文件中。

Jon*_*hon 6

您的代码抛出错误,而不是异常。您正在尝试使用一个不存在的类,而 PHP 通过抛出一个FatalThrowableError.

在 PHP 5 中,此代码会导致在浏览器中呈现致命错误消息,但是在 PHP 7(Laravel 5.5 需要此功能)中,PHP 现在会像异常一样抛出错误。这允许应用程序捕获这些错误,就像使用 try/catch 块的异常一样。

错误逃离 try/catch 块的原因是错误不是Exception,也不是它的子级。被抛出的对象是一个Error. 无论是ExceptionError类实现一个共同的接口,Throwable

Throwable
- Exception
- Error
Run Code Online (Sandbox Code Playgroud)

Laravel 的异常处理程序被编写来捕获这两个类,以便显示您看到的错误页面。

如果您将代码更改为以下内容,您会发现} catch (Throwable $e) {应该执行该块:

try {
    App\Models\justDoIt::find(1);
} catch (\Exception $ex) {
   dd('Exception block', $ex);
} catch (\Throwable $ex) {
   dd('Throwable block', $ex);
}
Run Code Online (Sandbox Code Playgroud)

有关这方面的更多信息,请参见此处


补充一点:如果您想知道您的代码有什么问题,那是因为您可能忘记了use控制器中的模型类:

use App\Models\justDoIt;
Run Code Online (Sandbox Code Playgroud)