我正在使用以下代码来捕获未捕获的异常和错误,
function my_exception_handler($e) {
$dataToStore = array("error" => $e, "server" => $_SERVER, "request" => $_REQUEST, "backtrace" => debug_backtrace());
//Store $dataToStore in a file
}
function my_error_handler($no, $str, $file, $line) {
$e = new ErrorException($str, $no, 0, $file, $line);
my_exception_handler($e);
}
set_error_handler('my_error_handler');
set_exception_handler('my_exception_handler');
我想知道是否有办法让这个商店只存在文件中的致命错误, $ e数组的严重程度总是为0。
答案 0 :(得分:1)
此任务需要register_shutdown_function
:
register_shutdown_function(function() {
$err = error_get_last();
if(!is_null($err)) {
if ($err['type'] == E_ERROR || $err['type'] == E_CORE_ERROR) { // extend if you want
// write to file..
}
}
});
// test it with
ini_set('max_execution_time', 1);
sleep(5);
$err['type']
可以包含此页面上定义的常量:Error Handling > Predefined Constants
有关详细信息,请参阅:Catching fatal errors in PHP
答案 1 :(得分:0)
function my_error_handler($no, $str, $file, $line) {
switch($no){
case E_CORE_ERROR:
$e = new ErrorException($str, $no, 0, $file, $line);
my_exception_handler($e);
break;
}
}
答案 2 :(得分:0)
根据PHP在set_error_handler上的文档,指定的处理程序应该是以下形式:
handler (int $ errno ,string $ errstr [,string $ errfile [,int $ errline [,array $ errcontext ]]])
(...)
第一个参数 errno ,包含引发的错误级别,为整数。
这意味着您应该以这种方式创建错误处理程序:
<?php
function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
// Only process fatal errors
if ($errno == E_ERROR) {
// Do your error processing
}
}
set_error_handler('my_error_handler');
?>
使用此方法,您可以精确控制处理各种错误的方式。
如果您只想处理致命错误,那么您可以做得更容易:
混合 set_error_handler (可调用$ error_handler [,int $ error_types = E_ALL | E_STRICT])
第二个参数$error_types
允许您指定应使用自定义错误处理程序处理哪些错误。你可以传递E_ERROR
常量,如下所示:
<?php
// Use your existing function
set_error_handler('my_error_handler', E_ERROR);
?>