如果错误处理程序 (参见 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();
...
?>
即使错误被隐藏(因为使用了字符 @、php.ini 文件中的“error_reporting”指令或使用了函数 error_reporting()),函数 error_get_last() 也会返回错误信息。
示例
<?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 致命错误。
# 使用 error_get_last 是“正确”的方法,但它需要 PHP 5.2+。备用方法是一个技巧。
if (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>');
}
?>
当然,这是依赖于语言的,所以在广泛分发的代码中它不会很好,但在某些情况下它可能会有所帮助(或者至少可以作为可行事物的基础)。
虽然 mbaierl dot com 邮箱中的邮件指出此函数并非最适合报告最近执行步骤的可能错误情况,但在某些情况下,了解最后一个错误特别有用——无论它何时发生。
例如,假设您有一些代码可以捕获动态页面的输出,并将其缓存以更快地交付给后续访问者。最终的健全性检查是查看脚本执行期间是否在任何地方发生了错误。如果发生错误,我们可能不想缓存该页面。