У меня есть скрипт с обработчиком исключений. Этот обработчик исключений очищает пару подключений, прежде чем скрипт выйдет после исключения.
Я хотел бы перебросить исключение из этого обработчика исключений, чтобы он обрабатывался собственным обработчиком исключительных событий 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 я читал: Еще одно решение – восстановить обработчик ошибок в начале обработчика исключений. Ты это пробовал?