我有以下情况:
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]
Type error: Argument 1 passed to App\Models\Task::setTracker() must be an instance of Carbon\Carbon, integer given, called in /var/www/app/Services/ShareLogic.php on line 60
并且不会被捕获
由于
答案 0 :(得分:13)
抓住Throwable
成功了。
不明白为什么?
有人吗?
答案 1 :(得分:2)
它没有捕获异常,因为您试图捕获.//selector
未扩展的\Exception
。
而是尝试通过导入来捕获实际异常..
Symfony\Component\Debug\Exception\FatalThrowableError
然后你可以做..
use Symfony\Component\Debug\Exception\FatalThrowableError;
好的,所以除了上面的解决方案之外,似乎PHP 7+处理错误的方式与PHP 5有点不同。所以试试吧..
try {
//
} catch(FatalThrowableError e) {
//
}
答案 2 :(得分:1)
为了记录和报告各种错误,Symfony的Debug组件要复杂得多,但请看一下这个简单的例子(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';
}
结果会是什么?良好:
致命错误:未捕获MyUncatchableError:BANG:在/ in / WJErU中调用布尔成员函数modify():6
堆栈追踪:
- 0 [内部函数]:myExceptionHandler(Object(Error))
1 {main}
在第6行/ / WJErU中投掷
并且您无法捕获该异常,因为您应该捕获原始的.. throwable,这是Error这种“错误”。您可以通过捕获“错误”类来捕获它。并且使用PHP7层次结构它实现了Throwable接口,这就是为什么你不能使用Exception捕获它(因为Exception实现Throwable时,Error不是异常 - 请参阅:http://php.net/manual/en/language.errors.php7.php)。
对于PHP7 +也是如此,因为5. *没有Throwable也没有Error,而$foo->modify();
只会停止脚本并返回致命错误。您可以创建自己的错误处理程序(set_error_handler
)并在那里抛出异常(并且Debug组件为php 5. *执行此操作),但此方法不适用于致命错误。相反,Debug组件挂钩到script shutdown并读取上一个错误和throws FatalErrorException。
这个描述可能不完全准确,因为我没有深入研究Symfony,但你可以在这里得到这个想法。