当我的脚本开始时,我有:
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
然后,我用PHP注册我的自定义错误处理程序:
function handleError($code, $text, $file, $line) {
echo "&%!!";
return true;
}
set_error_handler('handleError');
接下来,出现了一些产生如下错误的代码:
致命错误:调用未定义的方法 DB :: getInstanceForDB()in /Applications/MAMP/htdocs/mysite/classes/Test.php 在第32行
无论我是否指定自定义错误处理程序,我都会继续使用调用堆栈和我网站上的所有内容获取标准PHP错误消息框。知道什么是错的吗?
编辑:无论我是否返回true,它都不会调用我的自定义处理程序。
答案 0 :(得分:6)
首先,您需要使错误处理函数返回true。来自set_error_handler:
如果函数返回FALSE,则正常的错误处理程序继续。
其次,请注意set_error_handler
不会处理致命错误。您还需要使用register_shutdown_function。所以你的代码应该是这样的:
// Handles non-fatal errors
function handleError($code, $text, $file, $line) {
var_dump($code);
return true;
}
set_error_handler('handleError');
// Handles fatal errors
function fatalShutdown() {
var_dump(error_get_last());
}
register_shutdown_function('fatalShutdown');
答案 1 :(得分:3)
接受的答案是错误的,因为在所有关闭时都会调用关闭函数,包括在其他地方处理的关闭,或者只是在页面成功完成时。
除了使用set_exception_handler和set_error_handler之外,我最终得到了这个:
// from http://www.php.net/manual/en/function.set-error-handler.php
define('FATAL', E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING);
register_shutdown_function('shutdown');
// Handles "fatal" errors e.g. Syntax errors
function shutdown() {
// Only if there was an fatal error, this is run on all execution endpoints
$error_info = error_get_last();
if ($error_info !== null && ($error_info['type'] & FATAL)) {
# stack trace set to empty array, as generating one here is useless
[[ do stuff like emailing someone]]
}
}
答案 2 :(得分:0)
在你的问题中,你告诉你正在收到致命错误。
我认为你不能抓住那些,因为它们......好......致命。
以下错误类型不能 使用用户定义的函数处理:
E_ERROR
,E_PARSE
,E_CORE_ERROR
,E_CORE_WARNING
,E_COMPILE_ERROR
,E_COMPILE_WARNING
,以及大部分内容E_STRICT
在文件中提出set_error_handler()
被称为。{/ p>