PHP Profi

RFC Exception для fatal-ов принят

"PHP RFC: Exceptions in the engine (for PHP 7)" за авторством Никиты Попова был принят. Голосование началось и закончилось в оригинальные числа - 23 февраля и 8 марта smiley.

Суть RFC

Если в двух словах, то в RFC предлагается использовать исключения (Exception) на уровне движка, что позволит вместо fatal и recoverable fatal ошибок выбрасывать исключения.

Рассмотрим следующий пример кода:

function call_method($obj) {
    $obj->method();
}
 
call_method(null); // oops!

На данный момент этот код при водит к фатальной ошибке:

Fatal error: Call to a member function method() on a non-object in /path/file.php on line 4

В данном RFC предлагается выбрасывать исключение EngineException, и его можно будет отловить привычным способом:

try {
    call_method(null); // oops!
} catch (EngineException $e) {
    echo "Exception: {$e->getMessage()}\n";
}
Exception: Call to a member function method() on a non-object

 

Иерархия исключений

Предлагается использовать следующую иерархию классов Исключений:

BaseException (abstract)
 +- EngineException
 +- ParseException
 +- Exception
     +- ErrorException
     +- RuntimeException
         +- ...
     +- ...

 

А также

Кроме этого предлагается использовать ParseException вместо имеющихся ошибок парсинга, которое можно будет отловить так:

try {
    $result = eval($code);
} catch (\ParseException $exception) {
    // Handle $exception
}

 

Заключение

Итак, после этого мы сможем перехватывать такие ошибки и корректно их обрабатывать. Станет возможным выполнение корректного выхода из треда, правильное освобождение ресурсов, если выход не требуется (например, в блоке finally или в деструкторах классов, которые всё-таки будут вызываться). Более подробно об этом RFC можно прочитать на php.net: PHP RFC: Exceptions in the engine (for PHP 7)

2015-03-11

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий