10

我有以下情况:

  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

并且不会被抓到

谢谢

4

3 回答 3

19

捕捉起到Throwable了作用。
不知道为什么?有人会吗?

于 2017-04-23T05:38:56.433 回答
4

\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
}
于 2017-04-20T09:58:11.697 回答
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:6 中的布尔值上调用成员函数 modify()

堆栈跟踪:

  • 0 [内部函数]:myExceptionHandler(Object(Error))
  • 1 {主要}

    在第 6 行扔进 /in/WJErU

而且您无法捕获该异常,因为您应该在此处捕获原始的.. throwable,这是这种“错误”的错误您可以通过捕获“错误”类来捕获它。并且使用 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 组件挂钩到脚本关闭并读取最后一个错误并抛出 FatalErrorException

这个描述可能并不完全准确,因为我没有深入研究 Symfony,但你可以在这里得到这个想法。

于 2017-09-22T19:33:46.017 回答