【问题标题】:Can't catch exceptions in laravel无法在 laravel 中捕获异常
【发布时间】:2017-09-16 18:15:52
【问题描述】:

我有以下情况:

  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

不会被抓到

谢谢

【问题讨论】:

  • 如果你没有进入catch area,你怎么知道这条线会报错?
  • @PankitGami 查看我的更新
  • 请在beginTransactioncommit之间添加你写的代码。
  • @PankitGami - 完成
  • 请与社区分享答案。

标签: php laravel try-catch laravel-5.4 php-7.1


【解决方案1】:

捕捉Throwable 成功了。
不知道为什么? 有人会吗?

【讨论】:

  • 来自文档:Throwable is the base interface for any object that can be thrown via a throw statement in PHP 7, including Error and Exception. 抓住基地就会抓住它是有道理的。
【解决方案2】:

它没有捕获异常,因为您试图捕获 \ExceptionSymfony\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
}

【讨论】:

  • FatalThrowableError 最终确实继承自 Exception。每个异常都需要继承自异常。这不是 JAVA,你不能指望每一个特定的例外。事实并非如此
  • SexyMF 是正确的。沿着继承链回到顶部产生class FatalErrorException extends \ErrorException { ...。此外,直接来自 PHP 手册:“异常是 PHP 5 中所有异常的基类,也是 PHP 7 中所有用户异常的基类。” OP的问题源于另一个原因。
  • 好的,我提供了另一个解决方案。检查我的编辑。
【解决方案3】:

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';
}

结果会怎样?嗯:

致命错误:Uncaught MyUncatchableError: BANG: Call to a member function modify() on boolean in /in/WJErU:6

堆栈跟踪:

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

    在第 6 行的 /in/WJErU 中抛出

并且您无法捕获该异常,因为您应该在此处捕获原始的.. throwable,对于这种“错误”,它是Error。您可以通过捕获“错误”类来捕获它。并且使用 PHP7 层次结构,它实现了 Throwable 接口,这就是为什么你不能使用 Exception 捕获它的原因(因为当 Exception 实现 Throwable 时,Error 不是异常 - 请参阅:http://php.net/manual/en/language.errors.php7.php)。

对于 PHP7+ 也是如此,因为在 5.* 中没有 Throwable 也没有错误,并且执行 $foo-&gt;modify(); 只会停止脚本并返回致命错误。您可以创建自己的错误处理程序 (set_error_handler) 并在那里引发异常(Debug 组件为 php 5.* 执行此操作)但此方法不适用于致命错误。而是 Debug 组件挂钩到 script shutdown 并读取最后一个错误和 throws FatalErrorException

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

【讨论】:

    猜你喜欢
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2010-10-29
    • 1970-01-01
    • 2021-08-07
    • 2021-10-14
    相关资源
    最近更新 更多