Laravel:是否可以在捕获异常时记录堆栈跟踪并继续执行?

Ben*_*Ben 11 php error-handling exception laravel

Laravel 在异常捕获时具有可读的日志和堆栈跟踪,例如:

production.ERROR: Command "test" is not defined.

Did you mean this?
    make:test {"exception":"[object] (Symfony\\Component\\Console\\Exception\\CommandNotFoundException(code: 0): Command \"test\" is not defined.

Did you mean this?
    make:test at {root}/vendor/symfony/console/Application.php:618)
[stacktrace]
#0 {root}/vendor/symfony/console/Application.php(229): Symfony\\Component\\Console\\Application->find('test')
#1 {root}/vendor/symfony/console/Application.php(148): Symfony\\Component\\Console\\Application->doRun(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#2 {root}/vendor/laravel/framework/src/Illuminate/Console/Application.php(88): Symfony\\Component\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#3 {root}/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(121): Illuminate\\Console\\Application->run(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#4 {root}/artisan(37): Illuminate\\Foundation\\Console\\Kernel->handle(Object(Symfony\\Component\\Console\\Input\\ArgvInput), Object(Symfony\\Component\\Console\\Output\\ConsoleOutput))
#5 {main}
"}
Run Code Online (Sandbox Code Playgroud)

问题是:是否可以自己捕获异常,并记录相同格式的stacktrace,并继续程序执行。到目前为止,我正在记录一个Log::error(json_encode(debug_backtrace()));非常丑陋且难以追踪的错误。示例代码:

try {
    foo();
} catch(\Exception $e) {
    Log::error(json_encode(debug_backtrace()));
}
bar();
Run Code Online (Sandbox Code Playgroud)

小智 6

Laravel 有一个专门用于此目的的辅助方法,请参阅救援方法。

return rescue(function () { 
    return $this->method(); 
});
Run Code Online (Sandbox Code Playgroud)

使用您的示例,它看起来像:

rescue(function () { 
    return foo(); 
});

bar();
Run Code Online (Sandbox Code Playgroud)

  • 这非常丑陋且不直观。 (3认同)

mik*_*n32 6

您可以简单地手动调用应用程序的异常处理程序:

<?php
try {
    foo();
} catch(\Exception $e) {
    report($e);
}
bar();
Run Code Online (Sandbox Code Playgroud)

在 Laravel 5.5 中引入report()帮助程序为您提供与通常获得的相同的错误报告,包括您可能为其他日志记录通道等所做的任何自定义。