无法捕获symfony FatalErrorException

时间:2015-02-09 09:35:13

标签: php symfony exception-handling

我有这样的代码:

try {
    $var = $object->getCollection()->first()->getItem()->getName();
} catch(\Exception $e) {
    $var = null;
}

当然,我有交际变量和方法名称。这只是示范。

因此,如果我的集合为空,则Collection :: first()将返回false。然后getItem调用将抛出一个Symfony \ Component \ Debug \ Exception \ FatalErrorException,它不会被上面的代码捕获。

我的问题是我怎样才能抓住这个例外?我有这样的长链,有许多可以返回null的getter。所以我更喜欢这种方式,而不是检查每个值为null。

5 个答案:

答案 0 :(得分:44)

使用 Throwable 类而不是 Exception 类:

try {
    $var = $object->getCollection()->first()->getItem()->getName();
} catch(\Throwable $e) {
    $var = null;
    $msg = $e->getMessage();
}

由于从致命和可恢复错误抛出的PHP 7.0异常是新的和单独的异常类的实例:Error。这个新的Error类实现了Throwable接口,它指定的方法几乎与Exception的方法相同。因为Throwable在层次结构中更高,所以你可以同时捕获它,\ Error和\ Exception。

interface Throwable
|- Exception implements Throwable
    |- ...
|- Error implements Throwable
    |- TypeError extends Error
    |- ParseError extends Error
    |- ArithmeticError extends Error
        |- DivisionByZeroError extends ArithmeticError
    |- AssertionError extends Error

答案 1 :(得分:13)

正如您所看到的here,FatalErrorException扩展了ErrorException(PHP),它扩展了自己的php Exception类。

现在你已经拥有了所有这些元素,你已经为下一步做好了准备:正如异常名称所说,这是一个FatalError(一个与PHP相关的概念而不是Symfony2;在这种情况下,他们构建了一个包装类这个错误,可能是出于接口目的)。

PHP致命错误不是一个可以捕获的错误,因此在try ... catch块中保留可能导致FatalError的代码是没有用的

在尝试访问它们之前,您应该检查返回值,作为一个常见且良好的规则。

更新

由于我在 PHP7发布之后看到了对我的回答的支持,我想告诫since PHP7 is possible to catch fatal errors所以这个答案仍然有效但仅适用于PHP版本< 7.

答案 2 :(得分:0)

确定。我找到了解决方法。我使用属性访问器组件,它抛出简单的异常,而不是致命的错误。

$pa = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
try {
    $var = $pa->getValue($object, 'collection[0].item.name');
} catch(\Exception $e) {
    $var = null;
}

答案 3 :(得分:0)

适合我(PHP 7.0,Symfony 3.0.9):

use Symfony\Component\Debug\Exception\FatalThrowableError;
...
try {
    throw new FatalErrorException("something happened!", 0, 1, __FILE__, __LINE__);
} catch (FatalErrorException $e) {
    echo "Caught exception of class: " . get_class($e) . PHP_EOL;
}

输出:

Caught exception of class: Symfony\Component\Debug\Exception\FatalErrorException

答案 4 :(得分:-2)

你可以试试这个:

$foo = $object->getCollection()->first();
if($foo){
  $var = $foo->getItem()->getName();
} else {
    // fallback
}