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

Пример 1

try {
    $book->getBook();
} catch( Exception $e ) {
    error_log( $e );
    $error = 'A problem occurred getting your book'
}

Это работает нормально, но я бы предпочел не писать error_log повсюду.

Вместо этого я расширил класс Exception следующим образом:

Пример 2

class ExceptionLog extends Exception {
    public function __construct( $message, $code = 0, Exception $previous = null ) {
        error_log( $this );
        parent::__construct($message, $code, $previous);
    }
}

Я могу сделать:

try {
    $book->getBook();
} catch( ExceptionLog $e ) {
    $error = 'A problem occurred getting your book'
}

Единственная проблема здесь в том, что регистрируемое сообщение немного отличается. В первом примере запись в журнале:

[01-Jan-2016 19:24:51 Europe/London] PHP Fatal error:  Uncaught exception 'Exception' with message 'Could not get book' in book.php:39

Во втором примере сообщение опущено:

[01-Jan-2016 19:24:51 Europe/London] exception 'ExceptionLog' in book.php:39

Это единственный способ получить доступ к свойствам родительского класса Exception и вручную создать строку журнала ошибок?

Ответы (1)

Have you noticed that your custom error message is never being used?

Для этого есть две причины: в конструкторе класса ExceptionLog вы регистрируете ошибку перед вызовом родительского конструктора класса Exception, и вы никогда не передаете свое собственное сообщение об ошибке в конструктор класса ExceptionLog.

Ваш класс ExceptionLog должен выглядеть так:

class ExceptionLog extends Exception {
  public function __construct($message, $code = 0, Exception $previous = null) {
    parent::__construct($message, $code, $previous);
    error_log($this);
  }
}

Затем в вашем классе 'Book' у вас есть метод 'getBook ()', который выдает вашу пользовательскую ошибку (обратите внимание, что я явно выбрасываю ошибку в демонстрационных целях):

class Book {
  public function getBook() {
    throw new ExceptionLog('A problem occurred getting your book');
  }
}

Посмотрите, как вы передаете собственное сообщение об ошибке в конструктор класса ExceptionLog? Затем вы можете создать экземпляр класса Book:

$book = new Book();

И измените свой try / catch на следующее:

try {
  $book->getBook();
} catch (ExceptionLog $e) {
  //Custom error message is already defined
  //but you can still take other actions here
}

Это должно вызвать ошибку, аналогичную той, что я видел в моем файле 'php_error.log':

[01-Jan-2016 21:45:28 Europe/Berlin] exception 'ExceptionLog' with message 'A problem occurred getting your book' in /Applications/MAMP/htdocs/php_exception_test/index.php:13

2022 WebDevInsider