2016-01-01 3 views
1

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

Пример 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

Вы заметили, что ваше пользовательское сообщение об ошибке никогда не используется?

Для этого есть две причины: в своем конструкторе класса 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); 
    } 
} 

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

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

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

$book = new Book(); 

И изменить TRY/поймать на следующее:

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