如果错误处理程序 (参见 set_error_handler ) 成功处理了错误,则此函数不会报告该错误。
(PHP 5 >= 5.2.0, PHP 7, PHP 8)
error_get_last — 获取最后发生的错误
此函数没有参数。
返回一个关联数组,描述最后一个错误,其中包含键“type”,“message”,“file”和“line”。如果错误是由 PHP 内部函数引起的,则“message”以其名称开头。如果没有发生错误,则返回null
。
示例 #1 一个 error_get_last() 示例
<?php
echo $a;
print_r(error_get_last());
?>
以上示例将输出类似于
Array ( [type] => 8 [message] => Undefined variable: a [file] => C:\WWW\index.php [line] => 2 )
[编辑注:从 PHP 7.0.0 开始,可以使用 error_clear_last() 清除最近的错误。]
要清除 error_get_last(),或将其置于定义明确的状态,您应该使用下面的代码。即使设置了自定义错误处理程序,它也适用。
<?php
// var_dump 或其他任何内容,因为由于 0 永远不会调用它
set_error_handler('var_dump', 0);
@$undef_var;
restore_error_handler();
// error_get_last() 现在处于一个众所周知的状态:
// Undefined variable: undef_var
... // 执行某些操作
$e = error_get_last();
...
?>
函数 error_get_last() 将返回错误信息,即使错误被隐藏,因为您使用了字符 @,因为 php.ini 文件中的“error_reporting”指令,或者因为您使用了函数 error_reporting()。
示例
<?php
error_reporting(E_ALL ^ E_NOTICE);
$y = $x;
$err = error_get_last();
var_export($err);
?>
将显示:array ( 'type' => 8, 'message' => 'Undefined variable: x', 'file' => 'test.php', 'line' => 4, )
<?php
$y = @$x;
$err = error_get_last();
var_export($err);
?>
将显示:array ( 'type' => 8, 'message' => 'Undefined variable: x', 'file' => 'test.php', 'line' => 4, )
error_get_last() 函数将为您提供最新的错误,即使该错误是致命错误。
示例用法
<?php
register_shutdown_function('handleFatalPhpError');
function handleFatalPhpError() {
$last_error = error_get_last();
if($last_error['type'] === E_ERROR) {
echo "可以在这里对致命错误进行自定义输出和/或记录...";
}
}
?>
请注意,如果其他关闭函数引发错误,则注册关闭函数以捕获错误将不起作用。
<?php
register_shutdown_function('cleanupObjects');
register_shutdown_function('handleFatalPhpError');
function cleanupObjects() {
trigger_error('一个不重要的问题', E_USER_WARNING);
}
function handleFatalPhpError() {
$last_error = error_get_last();
if($last_error['type'] === E_ERROR || $last_error['type'] === E_USER_ERROR) {
echo "可以在这里对致命错误进行自定义输出和/或记录...";
}
}
trigger_error('一个严重的问题', E_USER_ERROR);
?>
在上面的代码中,$last_error 将包含警告,因为 cleanupObjects() 首先被调用。
要以可怕的方式模拟 PHP <5.2 中的此函数,您可以使用类似于此的内容。
<?php
if( !function_exists('error_get_last') ) {
set_error_handler(
create_function(
'$errno,$errstr,$errfile,$errline,$errcontext',
'
global $__error_get_last_retval__;
$__error_get_last_retval__ = array(
\'type\' => $errno,
\'message\' => $errstr,
\'file\' => $errfile,
\'line\' => $errline
);
return false;
'
)
);
function error_get_last() {
global $__error_get_last_retval__;
if( !isset($__error_get_last_retval__) ) {
return null;
}
return $__error_get_last_retval__;
}
}
?>
当然,可以使用带有 user_error() 的特殊字符串来判断两个语句之间是否发生了某些事情(代替 mbaierl dot com 邮件中提到的内置特殊重置):<?php
@user_error($error_get_last_mark='error_get_last mark');
$not_set;
$error_get_last=error_get_last();
$something_happened=($error_get_last['message']!=$error_get_last_mark); ?>
如果你的 <?php set_error_handler(function) ?> 函数返回 true,那么你将不得不自己编写 error_get_last 功能。(dmgx dot michael at gmail dot com 简要提到过)。
致手动审核员:关于 php.net/manual/add-note.php:我认为以上内容在技术上属于“对其他注释的引用”,因此我需要为自己辩护,我认为这可能表明了其他注释失败的地方,而我并没有其他途径联系 PHP 手册注释的读者。
此外,您也可以提供一些您认为可以接受的注释示例。感谢您的审核。
与 $php_errormsg 一样,如果用户定义的错误处理程序返回非 FALSE,则此函数的返回值可能不会更新。已在 PHP 5.2.6 上测试。
<?php
var_dump(PHP_VERSION);
// 输出:string(5) "5.2.6"
@trigger_error("foo");
$e=error_get_last();
var_dump($e['message']);
// 输出:string(3) "foo"
set_error_handler(create_function('$a,$b',''));
@trigger_error("bar");
$e=error_get_last();
var_dump($e['message']);
// 输出:string(3) "foo"
set_error_handler(create_function('$a,$b','return false;'));
@trigger_error("baz");
$e=error_get_last();
var_dump($e['message']);
// 输出:string(3) "baz"
?>
它无法完全重置,但你可以“清除”它,足以满足所有实际目的。
<?php
@trigger_error("");
// 执行操作...
$e=error_get_last();
if($e['message']!==''){
// 发生了错误
}
?>
请注意,error_get_last() 仅返回未捕获的错误。
已捕获的错误永远不会到达 error_get_last(),例如:
- 使用 set_error_handler() 注册的 $error_levels,当 $callback 不返回 false 时,
- 所有异常,包括 set_error_handler() 不支持的错误(例如:E_ERROR/致命错误、E_PARSE 等),这些错误实际上是异常,
当 set_exception_handler($callback) 注册时,
- 由 try/catch 块捕获的异常。
这是一个简单的邮件函数调试脚本...
<?php
// 由 Manomite 构建用于调试
class Error{
function __construct(){
error_reporting ( E_ALL ^ E_NOTICE );
$err = error_get_last ();
if($err){
$res = "您的应用程序中发生了错误,先生。\n 详细信息包括 ".$err.""
mail("[email protected]","发生了错误",$res,$from);
}
}
}
?>
如果您需要在 PHP 5.2 之前检查错误是否是致命错误(在我的情况下,在输出缓冲区处理程序中),您可以使用以下技巧。
<?php
# 检查是否存在 PHP 致命错误。\n# 使用 error_get_last 是“正确”的方法,但它需要 PHP 5.2+。备用方法是一个技巧。\nif (function_exists('error_get_last')) {
$lastPHPError = error_get_last();
$phpFatalError = isset($lastPHPError) && $lastPHPError['type'] === E_ERROR;
} else {
$phpFatalError = strstr($output, '<b>Fatal error</b>:') && ! strstr($output, '</html>');
}
?>
当然,这依赖于语言,因此它不适合在广泛发布的代码中使用,但在某些情况下它可能会有所帮助(或者至少可以作为有效方法的基础)。
虽然 mail at mbaierl dot com 指出此函数不适合报告最近执行步骤的可能的错误情况,但有一些情况需要知道最后发生的错误,无论它何时发生。
例如,假设您有一些代码可以捕获动态页面的输出,并将其缓存起来,以便更快地交付给后续访问者。最后的完整性检查将是查看脚本执行期间是否发生了错误。如果发生了错误,我们可能不想缓存该页面。