I have code like this:
try { $var = $object->getCollection()->first()->getItem()->getName(); } catch(\Exception $e) { $var = null; }
Of course i have communicative variable and method names. This is just demonstration.
So if my collection is empty the Collection::first() will return false. Then the getItem call will throw a Symfony\Component\Debug\Exception\FatalErrorException which won't be catched by the code above.
My question is that how can i catch this exception? I have long chains like this with many getters that can return null. So i prefer this way rather than checking every value for null.
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
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With