Является ли отправка отчета об ошибках из метода PHP Exception __destruct () хорошей или плохой идеей? - PullRequest
3 голосов
/ 15 февраля 2011

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

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

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 хорошим способом для достижения этой цели?

Есть ли лучший способ, которым я мог бы достичь этого?

Ответы [ 2 ]

1 голос
/ 15 февраля 2011

Почему бы вам просто не добавить метод в класс 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();
   }
}
1 голос
/ 15 февраля 2011

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

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

...