2013-03-06 112 views
24

如果我沒有在PHP中發現異常,我會在帶有堆棧跟蹤的error.log文件中收到一條有用的錯誤消息。例如,如果我運行:通過堆棧跟蹤記錄捕獲到的異常

<?php 

    function foo() { 
    throw new Exception('Oh no!'); 
    } 

    foo(); 

?> 

然後我得到這個寫我的日誌:

[Wed Mar 06 10:35:32 2013] [error] [client 86.146.145.175] PHP Fatal error: Uncaught exception 'Exception' with message 'Oh no!' in /var/www/test.php:4\nStack trace:\n#0 /var/www/test.php(7): foo()\n#1 {main}\n thrown in /var/www/test.php on line 4

有時候我想捕獲異常,但仍日誌細節。我想象類似:

<?php 

    function foo() { 
    throw new Exception('Oh no!'); 
    } 

    try { 
     foo(); 
    } catch (Exception $e) { 
     log_exception($e); 
    } 

?> 

其中log_exception將寫在基本相同的格式錯誤日誌的東西得到什麼未被捕捉異常的自動寫入 - 也許除了具有Caught exception代替PHP Fatal error: Uncaught exception字面上完全相同。

是否有內置的函數來記錄這樣的異常信息,或將其捕獲到字符串?我想象的是Python中的traceback.format_exc()

回答

36
error_log($e); 

做你想做的。如果沒有發現異常,它會記錄與記錄完全相同的內容,在開始時減去「Uncaught」一詞。它這樣做是因爲這就是Exception class's __toString() magic method返回的結果。

您可以在catch塊做到這一點:

try { 
    foo(); 
} catch (Exception $e) { 
    error_log("Caught $e"); 
} 

還是在異常處理程序:

set_exception_handler(function($exception) { 
    error_log($exception); 
    error_page("Something went wrong!"); 
}); 
+0

非常有用的答案來理解它。 – kta 2017-04-14 08:14:56