Throwable

Jakiś czas temu opisywałem działanie funkcji set_error_handler() w PHP, która pozwala nam na przechwytywanie większości błędów w naszej aplikacji. Niektóre typy takie jak: E_ERROR, E_PARSE, E_CORE_ERROR, E_CORE_WARNING, E_COMPILE_ERROR, E_COMPILE_WARNING itp.  nie są osiągalne. Dlatego dzisiaj chciałbym przedstawić alternatywne rozwiązanie. Od wersji PHP 7 istnieje możliwość przechwytywania błędów zarówno tych krytycznych (ang. fatal error) jak i tych możliwych do odzyskania (E_ERROR and E_RECOVERABLE_ERROR)[1]. Nie jest to oczywiście panaceum na obsługę wszystkich typów błędów (E_WARNING, E_NOTICE czy E_PARSE nie są tym objęte) także trzeba o tym pamiętać. Jednakże, to co możemy przechwycić jest zależne od klasy Error oraz całej jej rodziny, prezentowanej poniżej.

Error
      ArithmeticError
        DivisionByZeroError (tylko dla operatora % )
      AssertionError
      ParseError (tylko dla included/required file oraz eval())
      TypeError
        ArgumentCountError

Dla przykładu, weźmy dzielenie przez zero. Kod mógłby wyglądać tak

<?php

try {
    $quotient = 1 % 0;
} catch (Error $e) {
    echo $e->getMessage();
}
//Result: Modulo by zero

Ciekawym zabiegiem zastosowanym przez twórców PHP jest utworzenie nadklasy Throwable po której dziedziczy Error i Exception. Pozwala nam to łatwo zaadaptować kod pisany pod PHP 5.x z naszą aplikacją. [1][2].

<?php

try {
    // Code that may throw an Exception or Error.
} catch (Throwable $t) {
    // Executed only in PHP 7, will not match in PHP 5.x
} catch (Exception $e) {
    // Executed only in PHP 5.x, will not be reached in PHP 7
}

A czy Wy korzystacie już w swoich programach z Throwable ?

Źródło
[1] https://trowski.com/2015/06/24/throwable-exceptions-and-errors-in-php7/
[2] https://sergeyzhuk.me/2016/12/24/php7-errors-and-exceptions/
[3] https://www.php.net/manual/en/class.throwable.php