Съвременни проблеми при бубулацията на PHP грешките

Да видим какво пише тук:

As with normal exceptions, these Error exceptions will bubble up until they reach the first matching catch block. If there are no matching blocks, then any default exception handler installed with set_exception_handler() will be called, and if there is no default exception handler, then the exception will be converted to a fatal error and will be handled like a traditional error.

An exception handler handles exceptions that were not caught before. It is the nature of an exception that it discontinues execution of your program – since it declares an exceptional situation in which the program cannot continue (except you catch it).

Ако такъв блок не бъде намерен, се надяваме, че поне глобално имаме зададен exception handler с помощта на set_exception_handler()

Ако и такъв хендлър нямаме зададен, ще имаме fatal error.

Демек, хвърлен exception трябва да бъде прихванат задължително!

Добър въпрос е ако вече и в set_exception_handler() възникне грешка, дали ще се изпълни хендлърът, зададен с set_error_handler()?

Да, ще се. Нека разгледаме следният пример:

set_error_handler(function (int $errno, string $errstr, string $errfile, int $errline,): bool {
    echo "Error has occurred: ", $errstr, PHP_EOL;

    /**
     * It is important to remember that the standard PHP error handler is completely bypassed
     * for the error types specified by error_levels UNLESS the callback function returns false.
     * Демек, ако върнем FALSE за даденият тип грешка, това ще значи,
     * че обработването и (на този тип грешка)
     * ще продължи И КЪМ стандартният обработчик.
     * Демек, върнем ли TRUE - до там! Няма да използваме и стандартният обработчик.
     * Но пак да кажем - до там само за даденият тип грешка.
     */
    return false;
});

set_exception_handler(function (Throwable $ex): void {
    echo "Uncaught exception: ", $eXd->getMessage(), PHP_EOL;
});

throw new Exception('Catch me if you can.');

echo "Not Executed" . PHP_EOL;

Имаме ли грешка в set_exception_handler(), демек по време на хвърляне на ексепшън, ще влезем и в set_error_handler()