2016-01-01 184 views
1

PHP只記錄未捕獲的異常。我還想記錄我所有的抓到的的例外情況。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

您是否注意到您的自定義錯誤消息從未被使用?

有兩個原因:在您的'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/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