Exceptions in PHP7

Prelude

Many PHP developers still using Exceptions in old PHP5 style. It is ok. There is nothing wrong. But moving forward you can, and probably should, use new features from PHP7.

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.

Hierarchy of Error types

Here's a chart that demonstrates the new hierarchy introduced in PHP 7:

\Throwable
├── \Exception implements \Throwable
│   ├── \LogicException extends \Exception
│   │   ├── \BadFunctionCallException extends \LogicException
│   │   │   └── \BadMethodCallException extends \BadFunctionCallException
│   │   ├── \DomainException extends \LogicException
│   │   ├── \InvalidArgumentException extends \LogicException
│   │   ├── \LengthException extends \LogicException
│   │   └── \OutOfRangeException extends \LogicException
│   └── \RuntimeException extends \Exception
│       ├── \OutOfBoundsException extends \RuntimeException
│       ├── \OverflowException extends \RuntimeException
│       ├── \RangeException extends \RuntimeException
│       ├── \UnderflowException extends \RuntimeException
│       └── \UnexpectedValueException extends \RuntimeException
└── \Error implements \Throwable
    ├── \AssertionError extends \Error
    ├── \ParseError extends \Error
    ├── \TypeError extends \Error
    │   └── \ArgumentCountError extends \TypeError
    └── \ArithmeticError extends \Error
        └── \DivisionByZeroError extends \ArithmeticError
        

So here is the description of some of them:

  • Throwable is the base interface for any object that can be thrown via a throw statement in PHP 7, including Error and Exception.
  • Error is the base class for all internal PHP errors.
  • AssertionError is thrown when an assertion made via assert() fails.
  • ParseError is thrown when an error occurs while parsing PHP code, such as when eval() is called.
  • TypeError There are three scenarios where a TypeError may be thrown. The first is where the argument type being passed to a function does not match its corresponding declared parameter type. The second is where a value being returned from a function does not match the declared function return type. The third is where an invalid number of arguments are passed to a built-in PHP function (strict mode only).
  • ArithmeticError is thrown when an error occurs while performing mathematical operations. In PHP 7.0, these errors include attempting to perform a bit shift by a negative amount, and any call to intdiv() that would result in a value outside the possible bounds of an integer.
  • DivisionByZeroError is thrown when an attempt is made to divide a number by zero.
  • ArgumentCountError is thrown when too few arguments are passed to a user-defined function or method.

Catching Multiple Exception Types

According to RFC you can use several catch blocks. Be sure that you have PHP 7.1

This one you might know. You can rethrow exception

You can also use block finally

A little demo for using Exceptions, Errors and handle them:

Remember! Errors will continue executing PHP application while Exceptions stop executing it!