Symfony 2:如何捕获可捕获的致命错误


Symfony 2: How to catch Catchable Fatal Error?

如何捕获这种类型的错误?

contextrorexcexception: Catchable Fatal Error: Argument 1传递给AA'SomeBundle'Entity'SomeEntity::setCity()必须是AA'SomeBundle'Entity'City的一个实例,null给定,在/srv/dev/some_path/vendor/symfony/symfony/src/symfony/Component/PropertyAccess/PropertyAccessor.php中360行调用,并在/srv/dev/some_path/src/AA/SomeBundle/Entity/SomeEntity.php中788行定义

我正试着抓住这样的一切:

$form = $this->createForm(new SomeFormType(), $instanceOfSomeEntity);
try {
    $form->handleRequest($request);
} catch ('Exception $e) {
    $form->addError(new FormError('missing_information'));
}

解决这个问题的最简单方法是在有问题的代码前面加上@符号,这样任何警告都将被抑制。任何错误都应该在try…catch中捕获。

不理想,因为@具有重要的性能影响,但否则,您可能会看到替换错误处理,或者在我的情况下,从XML读取时,在尝试获取值之前检查每个标记的存在。

这是我的代码,通过添加'@'来修复

    try {
        $value = @$this->XML->StructuredXMLResume->ContactInfo->ContactMethod->PostalAddress->DeliveryAddress->AddressLine;
    } catch ('Exception $e) {
        $value = '';
    }

你可以想象,检查每一层到AddressLine将是荒谬的。

您必须禁用错误报告并使用error_get_last()函数捕获最后一个错误,这里有一个来自Symfony Finder组件的示例:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Finder/SplFileInfo.php#L65

另一种方法是创建自定义错误处理程序,下面是来自独白的示例:https://github.com/Seldaek/monolog/blob/master/src/Monolog/ErrorHandler.php

相关文章: