2013-03-06 72 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