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

时间:2014-06-19 08:57:45

标签: php symfony

如何捕获此类错误?

ContextErrorException:Catchable Fatal Error:Argument 1传递给AA \ SomeBundle \ Entity \ SomeEntity :: setCity()必须是AA \ SomeBundle \ Entity \ City的实例,null,在/ srv / dev中调用第360行的/some_path/vendor/symfony/symfony/src/Symfony/Component/PropertyAccess/PropertyAccessor.php,在/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'));
}

2 个答案:

答案 0 :(得分:0)

解决此问题的最简单方法是使用@符号为违规代码添加前缀,以便抑制任何警告。然后应该在try ... catch中捕获任何错误。

不理想,因为@具有非平凡的性能影响,但除此之外,您正在考虑更换错误​​处理,或者在我的情况下,从XML读取时,在尝试获取值之前检查每个标记的存在。

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

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

您可以想象,将每个级别检查到AddressLine都是荒谬的。

答案 1 :(得分:-1)

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

另一种方法是创建一个自定义错误处理程序,这里是Monolog的一个例子:https://github.com/Seldaek/monolog/blob/master/src/Monolog/ErrorHandler.php