Исключение исключения в обработчике исключений

У меня есть скрипт с обработчиком исключений. Этот обработчик исключений очищает пару подключений, прежде чем скрипт выйдет после исключения.

Я хотел бы перебросить исключение из этого обработчика исключений, чтобы он обрабатывался собственным обработчиком исключительных событий PHP, где ошибка записывается в журнал ошибок PHP или по умолчанию, как это указано в PHP.ini.

К сожалению, это не похоже на возможность, как указано здесь:

http://www.php.net/manual/en/function.set-exception-handler.php#68712

Возникет Неустранимая ошибка: Исключение выбрано без рамки стека

Есть ли другой способ пузырить ошибку в стеке, чтобы PHP обрабатывал ее после того, как обработчик исключений завершил очистку?

Вы не можете повторно выбрасывать из обработчика исключений, однако есть и другие места, которые вы можете. Например, вы можете __destruct() повторный бросок от обработчика, инкапсулируя вещи в собственный класс, а затем использовать __destruct() (PHP 5.3, Demo ):

 <?php class ExceptionHandler { private $rethrow; public function __construct() { set_exception_handler(array($this, 'handler')); } public function handler($exception) { echo "cleaning up.\n"; $this->rethrow = $exception; } public function __destruct() { if ($this->rethrow) throw $this->rethrow; } } $handler = new ExceptionHandler; throw new Exception(); 

Поместите это в свой журнал ошибок:

 [29-Oct-2011 xx:32:25] PHP Fatal error: Uncaught exception 'Exception' in /.../test-exception.php:23 Stack trace: #0 {main} thrown in /.../test-exception.php on line 23 

Просто поймайте исключение и запишите сообщение самостоятельно, затем сверните.

 try { $foo->doSomethingToCauseException(); } catch (Exception $e) { error_log($e->getMessage()); throw $e; } 

Если вы пузыритесь до вершины и PHP не может справиться, это приведет к неперехватному исключению.

Возникет Неустранимая ошибка: Исключение выбрано без рамки стека

Эта ошибка означает, что ваше исключение выбрасывается из кода, который не является частью скрипта (насколько это известно PHP). Примеры такого кода включают настраиваемый обработчик исключений с set_exception_handler () и любым методом деструктора класса. Нет выбора, кроме как НЕ выбрасывать исключение из такого кода.

Если вы хотите встроенную обработку ошибок PHP, я бы предложил вам вместо этого вызвать trigger_error () . Он должен регистрировать ошибку, если у вас нет настраиваемого обработчика ошибок, и вы используете подходящий тип ошибки. Например, E_USER_ERROR должно быть в порядке.

Просто перестройте исключение как исключение RunTimeException, и оно будет содержать stacktrace 🙂

 try { // bad exception throwing code } catch (Exception $e) { throw new RuntimeException($e->getMessage(), $e->getCode(), $e); } 

С http://www.php.net/manual/en/function.set-exception-handler.php#88082 я читал: Еще одно решение – восстановить обработчик ошибок в начале обработчика исключений. Ты это пробовал?