无法捕捉到符号致命错误异常更新

2022-08-30 12:37:41

我有这样的代码:

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

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

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

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


答案 1

使用可抛出类而不是异常类:

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

由于 PHP 7.0 从致命和可恢复错误引发的异常是新的单独异常类的实例:。这个新类实现了 interface,它指定的方法与 几乎相同的方法。因为在层次结构中更高,你可以用它来捕获它,\错误和\异常。ErrorErrorThrowableExceptionThrowable

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

答案 2

正如你在这里看到的,FatalErrorException扩展了ErrorException(PHP),它扩展了自身php Exception类。

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

PHP致命错误不是可捕获的错误,因此将可能导致致命错误的代码保留在块内是非常无用的。try ... catch

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

更新

由于我在PHP7发布看到了对我的答案的赞成票,我想提醒一下,由于PHP7可以捕获致命错误,因此此答案仍然有效,但仅适用于php版本<7。


推荐