无法捕获 laravel 中的异常
Can't catch exceptions in laravel
我有以下情况:
try {
DB::beginTransaction();
$task = new Task();
$task->setTracker("");
//thrown \Symfony\Component\Debug\Exception\FatalThrowableError
DB::commit();
}catch (\Exception $e){
DB::rollBack();
Log::error($e);
//throw $e;
}
我不会进入捕获区。
知道为什么吗?
更新
这是抛出的错误:
[Symfony\Component\Debug\Exception\FatalThrowableError]
类型错误:传递给 App\Models\Task::setTracker() 的参数 1 必须是 Carbon\Carbon 的实例,给定整数,在第 60[=31 行的 /var/www/app/Services/ShareLogic.php 中调用=]
不会被抓到
谢谢
它没有捕捉到异常,因为您正试图捕捉 \Exception
而 Symfony\Component\Debug\Exception\FatalThrowableError
没有扩展。
而是尝试通过导入来捕获实际异常..
use Symfony\Component\Debug\Exception\FatalThrowableError;
然后你可以做..
try {
//
} catch(FatalThrowableError e) {
//
}
编辑
好的,所以除了上述解决方案之外,PHP 7+ 处理错误的方式与 PHP 5 有点不同。所以试试这个..
try {
//
} catch(Error $e) {
// This should work
} catch(Throwable $e) {
// This should work as well
}
抓住 Throwable
成功了。
不知道为什么?
有人做吗?
为了记录和报告各种错误,Symfony 的调试组件要复杂得多,但看看这个简单的例子 (php 7.1.x):
<?php
class MyUncatchableError extends Exception {}
function myExceptionHandler($e) {
throw new MyUncatchableError('BANG: '.$e->getMessage());
}
set_exception_handler('myExceptionHandler');
$foo = true;
try {
$foo->modify();
} catch (Exception $e) {
echo 'nope';
} catch (MyUncatchableError $e) {
echo 'nope2';
}
结果会怎样?恩:
Fatal error: Uncaught MyUncatchableError: BANG: Call to a member function modify() on boolean in /in/WJErU:6
Stack trace:
- 0 [internal function]: myExceptionHandler(Object(Error))
1 {main}
thrown in /in/WJErU on line 6
并且您无法捕获该异常,因为您应该在此处捕获原始的.. throwable,即 Error for this kind of "error". You can catch it by catching "Error" class. And with PHP7 hierarchy it implements Throwable interface, that's why you can't catch it using Exception (because while Exception implements Throwable, Error is no an Exception - see: http://php.net/manual/en/language.errors.php7.php)。
对于 PHP7+ 也是如此,因为 5.* 没有 Throwable 和 Error,而 $foo->modify();
只会停止脚本,return 会出现致命错误。您可以制作自己的错误处理程序 (set_error_handler
) 并在那里抛出异常(并且 Debug 组件为 php 5.* 执行此操作)但此方法不适用于致命错误。相反,Debug 组件挂接到 script shutdown and reads last error and throws FatalErrorException.
由于我没有深入研究 Symfony,因此此描述可能并不完全准确,但您可以在此处了解思路。
我有以下情况:
try {
DB::beginTransaction();
$task = new Task();
$task->setTracker("");
//thrown \Symfony\Component\Debug\Exception\FatalThrowableError
DB::commit();
}catch (\Exception $e){
DB::rollBack();
Log::error($e);
//throw $e;
}
我不会进入捕获区。
知道为什么吗?
更新
这是抛出的错误:
[Symfony\Component\Debug\Exception\FatalThrowableError]
类型错误:传递给 App\Models\Task::setTracker() 的参数 1 必须是 Carbon\Carbon 的实例,给定整数,在第 60[=31 行的 /var/www/app/Services/ShareLogic.php 中调用=]
不会被抓到
谢谢
它没有捕捉到异常,因为您正试图捕捉 \Exception
而 Symfony\Component\Debug\Exception\FatalThrowableError
没有扩展。
而是尝试通过导入来捕获实际异常..
use Symfony\Component\Debug\Exception\FatalThrowableError;
然后你可以做..
try {
//
} catch(FatalThrowableError e) {
//
}
编辑
好的,所以除了上述解决方案之外,PHP 7+ 处理错误的方式与 PHP 5 有点不同。所以试试这个..
try {
//
} catch(Error $e) {
// This should work
} catch(Throwable $e) {
// This should work as well
}
抓住 Throwable
成功了。
不知道为什么?
有人做吗?
为了记录和报告各种错误,Symfony 的调试组件要复杂得多,但看看这个简单的例子 (php 7.1.x):
<?php
class MyUncatchableError extends Exception {}
function myExceptionHandler($e) {
throw new MyUncatchableError('BANG: '.$e->getMessage());
}
set_exception_handler('myExceptionHandler');
$foo = true;
try {
$foo->modify();
} catch (Exception $e) {
echo 'nope';
} catch (MyUncatchableError $e) {
echo 'nope2';
}
结果会怎样?恩:
Fatal error: Uncaught MyUncatchableError: BANG: Call to a member function modify() on boolean in /in/WJErU:6
Stack trace:
- 0 [internal function]: myExceptionHandler(Object(Error))
1 {main}
thrown in /in/WJErU on line 6
并且您无法捕获该异常,因为您应该在此处捕获原始的.. throwable,即 Error for this kind of "error". You can catch it by catching "Error" class. And with PHP7 hierarchy it implements Throwable interface, that's why you can't catch it using Exception (because while Exception implements Throwable, Error is no an Exception - see: http://php.net/manual/en/language.errors.php7.php)。
对于 PHP7+ 也是如此,因为 5.* 没有 Throwable 和 Error,而 $foo->modify();
只会停止脚本,return 会出现致命错误。您可以制作自己的错误处理程序 (set_error_handler
) 并在那里抛出异常(并且 Debug 组件为 php 5.* 执行此操作)但此方法不适用于致命错误。相反,Debug 组件挂接到 script shutdown and reads last error and throws FatalErrorException.
由于我没有深入研究 Symfony,因此此描述可能并不完全准确,但您可以在此处了解思路。