error_get_last

(PHP 5 >= 5.2.0, PHP 7, PHP 8)

error_get_last获取最后发生的错误

说明

error_get_last(): ?array

获取有关最后发生的错误的信息。

参数

此函数没有参数。

返回值

返回一个关联数组,描述最后一个错误,其中包含键“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
)

添加备注

用户贡献的备注 14 个备注

dmgx dot michael at gmail dot com
13 年前
如果错误处理程序 (参见 set_error_handler ) 成功处理了错误,则此函数不会报告该错误。
nicolas dot grekas+php at gmail dot com
10 年前
[编辑注:从 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();

...

?>
Skrol29
14 年前
函数 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, )
michael at getsprink dot com
15 年前
error_get_last() 函数将为您提供最新的错误,即使该错误是致命错误。

示例用法

<?php

register_shutdown_function
('handleFatalPhpError');

function
handleFatalPhpError() {
$last_error = error_get_last();
if(
$last_error['type'] === E_ERROR) {
echo
"可以在这里对致命错误进行自定义输出和/或记录...";
}
}

?>
iant at clickwt dot com
14 年前
请注意,如果其他关闭函数引发错误,则注册关闭函数以捕获错误将不起作用。

<?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 at joert dot net
13 年前
要以可怕的方式模拟 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__;
}
}
?>
vike2000 at google mail domain
11 年前
当然,可以使用带有 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 手册注释的读者。
此外,您也可以提供一些您认为可以接受的注释示例。感谢您的审核。
Brad
16 年前
与 $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"
?>
Brad
16 年前
它无法完全重置,但你可以“清除”它,足以满足所有实际目的。
<?php
@trigger_error("");
// 执行操作...
$e=error_get_last();
if(
$e['message']!==''){
// 发生了错误
}
?>
Krzysztof Przygoda
1 年前
请注意,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 块捕获的异常。
admin at manomite dot net
6 年前
这是一个简单的邮件函数调试脚本...

<?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);
}
}
}
?>
scott at eyefruit dot com
14 年前
如果您需要在 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
16 年前
此函数非常无用,因为它无法重置,因此无法知道错误是否真的发生在该函数调用之前的行。
phil at wisb dot net
15 年前
虽然 mail at mbaierl dot com 指出此函数不适合报告最近执行步骤的可能的错误情况,但有一些情况需要知道最后发生的错误,无论它何时发生。

例如,假设您有一些代码可以捕获动态页面的输出,并将其缓存起来,以便更快地交付给后续访问者。最后的完整性检查将是查看脚本执行期间是否发生了错误。如果发生了错误,我们可能不想缓存该页面。
To Top