Exceptions advanced
| Throwable tree | |
| Custom classes | |
| Previous chaining | |
| Finally patterns |
Throwable tree
Throwable sits at the top of the tree, with Error and Exception below it. Most daily code throws and catches Exception types.
Catch narrow types first and broad types last. Let most Errors surface during development so real bugs stay loud.
try { throw new RuntimeException("boom"); } catch (RuntimeException $e) { echo $e->getMessage(); }
Custom classes
Small exception classes name each failure. A reader sees NotFound at once instead of decoding a plain message.
Extend a fitting base like RuntimeException and add no extra code at first. The name alone already helps logs and catch blocks.
class NotFound extends RuntimeException { } throw new NotFound("page gone");
Previous chaining
Wrap a low level error in a clearer one, but keep the first error as previous. The full chain stays open for logs and debug screens.
Pass the caught error as the third argument when you throw the new one. getPrevious reads the chain back later.
try { throw new RuntimeException("db down"); } catch (RuntimeException $e) { throw new RuntimeException("login failed", 0, $e); }
Finally patterns
The finally block runs with or without an error. It is the home for cleanup that must always happen.
Close handles and release locks there. Every path then cleans up the same way, and resources never leak past the call.
$f = fopen("php://memory", "r"); try { $line = fgets($f); } finally { fclose($f); }
Next: Generators advanced
Article author: Arthur Isaev