Can't catch symfony FatalErrorException

后端 未结 4 444
感情败类
感情败类 2020-12-29 19:29

I have code like this:

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


        
相关标签:
4条回答
  • 2020-12-29 19:36

    Works for me (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;
    }
    

    Output:

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

    0 讨论(0)
  • 2020-12-29 19:52

    Use Throwable class instead Exception class:

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

    Since PHP 7.0 exceptions thrown from fatal and recoverable errors are instances of a new and separate exception class: Error. This new Error class implements Throwable interface, which specifies methods nearly identical to those of Exception. Because Throwable is higher in hierarchy you can catch with it both, \Error and \Exception.

    interface Throwable
    |- Exception implements Throwable
        |- ...
    |- Error implements Throwable
        |- TypeError extends Error
        |- ParseError extends Error
        |- ArithmeticError extends Error
            |- DivisionByZeroError extends ArithmeticError
        |- AssertionError extends Error
    
    0 讨论(0)
  • 2020-12-29 19:55

    As you can see here, FatalErrorException extends ErrorException (PHP) that extends itself php Exception class.

    Now that you have all this elements, you're ready for next step: as the name of exception says, this is a FatalError (a concept related to PHP and not with Symfony2; in that case they built a wrapper class for this error, maybe for interface purposes).

    A PHP fatal error isn't a catchable one so is pretty useless to keep the code that could cause the FatalError, inside a try ... catch block

    You should check, as a common and good rule, whenever is possible for returned values before try to access them.

    Update

    Since I've seen an upvote to my answer after PHP7 was released, I would like to caveat that since PHP7 is possible to catch fatal errors so this answer is still valid but only for PHP versions < 7.

    0 讨论(0)
  • 2020-12-29 19:55

    Ok. I've found a workaround. I use the property accessor component which throws simple exceptions, not fatal errors.

    $pa = \Symfony\Component\PropertyAccess\PropertyAccess::createPropertyAccessor();
    try {
        $var = $pa->getValue($object, 'collection[0].item.name');
    } catch(\Exception $e) {
        $var = null;
    }
    
    0 讨论(0)
提交回复
热议问题