在laravel

时间:2017-04-20 08:20:34

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

我有以下情况:

  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

并且不会被捕获

由于

3 个答案:

答案 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,但你可以在这里得到这个想法。