Является ли отправкой отчета об ошибке из PHP Exception __destruct () методом «Хорошая или плохая идея»?

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

Я думал о классе:

class My_Exception extends Exception { private $sendErrorReport = true; public function __destruct() { if ($this->sendErrorReport) { // send the error report by email } } public function cancelErrorReport() { $this->sendErrorReport = false; } } 

И я хочу сделать что-то вроде этого:

 try { do_something_that_can_throw_exception(); catch (My_Exception $e) { if ($e->getCode() == I_KNOW_WHAT_TO_DO ) { react_to_exception(); $e->cancelErrorReport(); } else { show_error_message($e->getMessage()); } } 

Итак, в основном, когда происходит исключение, и система знает, что делать, это не беспокоит меня как разработчика. Но когда есть что-то, с чем система не справляется, тогда меня уведомляют. Я не хочу размещать код, который уведомляет меня в предложении catch, потому что я уверен, что я его где-то забуду …

Могу ли я быть уверенным, что будет вызван метод исключения __destuct?

Является ли метод исключения __destruct отличным способом достижения этой цели?

Есть ли лучший способ добиться этого?

Solutions Collecting From Web of "Является ли отправкой отчета об ошибке из PHP Exception __destruct () методом «Хорошая или плохая идея»?"

Нет, это не очень хорошая идея.

Лучше всего заменить необработанный обработчик исключений. См. set_exception_handler . Если вы поймаете исключение, а затем передумаете и хотите оставить исключение для обработчика исключений (например, в вашем примере, при анализе кода ошибки), вы всегда можете перебросить исключение. Конечно, лучшим вариантом было бы подклассифицировать исключение вместо того, чтобы полагаться на код ошибки.

Почему бы вам просто не добавить метод класса Exception для отправки электронной почты при его вызове? Что-то вроде:

 class My_Exception extends Exception { private $sendErrorReport = true; public function __destruct() { if ($this->sendErrorReport) { // send the error report by email } } public function cancelErrorReport() { $this->sendErrorReport = false; } public function sendEmail() { mail(....., $this->getMessage()); } } 

и тогда вы делаете что-то вроде:

 try { do_something_that_can_throw_exception(); catch (My_Exception $e) { if ($e->getCode() == I_KNOW_WHAT_TO_DO ) { react_to_exception(); $e->cancelErrorReport(); } else { $e->sendEmail(); } }