📜  如何使用PHP获取上次发生的错误?(1)

📅  最后修改于: 2023-12-03 15:08:25.531000             🧑  作者: Mango

如何使用PHP获取上次发生的错误?

在PHP开发中,我们经常需要查看程序运行时产生的错误信息,以便快速定位问题,并及时解决。PHP提供了内置的函数来获取上次发生的错误信息,本文将介绍其中的一些,以及如何使用它们。

错误报告级别

首先,需要了解PHP中的错误报告级别。PHP提供了7种不同的错误报告级别,分别为:

  • E_ERROR:致命错误,程序无法继续执行
  • E_WARNING:非致命警告,不影响程序正常运行,但需要注意
  • E_PARSE:解析错误,通常是语法错误
  • E_NOTICE:提示信息,通常是一些变量未定义、数组下标越界等
  • E_CORE_ERROR:PHP启动时发生的致命错误
  • E_CORE_WARNING:PHP启动时发生的非致命警告
  • E_COMPILE_ERROR:编译时致命错误
  • E_COMPILE_WARNING:编译时非致命警告
  • E_USER_ERROR:开发者自定义的致命错误
  • E_USER_WARNING:开发者自定义的非致命警告
  • E_USER_NOTICE:开发者自定义的提示信息
  • E_DEPRECATED:废弃的特性警告
  • E_USER_DEPRECATED:开发者自定义的废弃特性警告

我们可以使用 error_reporting 函数来设置PHP错误报告级别,例如:

// 关闭所有错误报告
error_reporting(0);

// 报告所有错误
error_reporting(E_ALL);

// 报告除E_NOTICE以外的所有错误
error_reporting(E_ALL ^ E_NOTICE);
获取错误信息
函数:error_get_last

error_get_last 函数可以获取最近一次发生的错误信息,返回一个包含错误信息的关联数组。这个函数在PHP5.2.0之后才引入,如果之前的版本需要获取上次错误信息,可以使用其他函数。

下面是一个示例代码:

// 故意制造一个错误
echo $x;

// 获取上次错误信息
$last_error = error_get_last();
if ($last_error !== null) {
    echo "错误类型:{$last_error['type']}<br>";
    echo "错误信息:{$last_error['message']}<br>";
    echo "错误文件:{$last_error['file']}<br>";
    echo "错误行号:{$last_error['line']}<br>";
} else {
    echo "没有发生错误<br>";
}

代码解析:

  1. 故意制造一个错误,因为 $x 变量未定义,将会提示未定义变量的错误。
  2. 使用 error_get_last 函数获取上次发生的错误信息。如果没有错误信息,返回 null。
  3. 如果有错误信息,输出错误类型、信息、文件和行号。否则,输出“没有发生错误”。

示例输出:

Notice: Undefined variable: x in /path/to/file.php on line 3
错误类型:8
错误信息:Undefined variable: x
错误文件:/path/to/file.php
错误行号:3
函数:set_error_handler

我们可以使用 set_error_handler 函数来设置自定义的错误处理函数,它可以接收四个参数:错误级别、错误信息、错误文件和错误行号。

下面是一个示例代码:

// 自定义错误处理函数
function my_error_handler($errno, $errstr, $errfile, $errline) {
    echo "<b>错误:</b>[$errno] $errstr<br>";
    echo "<b>位置:</b>$errfile [第 $errline 行]<br><br>";
}

// 注册自定义错误处理函数
set_error_handler("my_error_handler");

// 故意制造一个错误
echo $x;

代码解析:

  1. 定义一个自定义错误处理函数 my_error_handler,它接受四个参数:错误级别、信息、文件和行号。在这里,我们简单地输出了错误信息和位置。
  2. 使用 set_error_handler 函数将自定义的错误处理函数注册到PHP的错误处理系统中。
  3. 故意制造一个错误,因为 $x 变量未定义,将会提示未定义变量的错误。
  4. 自定义错误处理函数被调用,并输出错误信息和位置。

示例输出:

错误:[8] Undefined variable: x
位置:/path/to/file.php [第 9 行]
函数:debug_backtrace

除了使用 error_get_lastset_error_handler 函数获取错误信息外,我们还可以使用 debug_backtrace 函数查看当前的函数调用栈。

下面是一个示例代码:

// 自定义一个函数
function foo() {
    // 故意制造一个错误
    echo $x;
}

// 调用自定义函数
foo();

代码解析:

  1. 定义自定义函数 foo,它故意制造一个未定义变量的错误。
  2. 调用自定义函数 foo,将会提示未定义变量的错误。
  3. 使用 debug_backtrace 函数获取当前程序的函数调用栈。
  4. 输出函数调用栈信息。
// 获取函数调用栈
$backtrace = debug_backtrace();

// 输出函数调用栈信息
foreach ($backtrace as $i => $trace) {
    if ($i == 0) {
        continue;
    }
    echo "位置:{$trace['file']} [第{$trace['line']}行] --> {$trace['function']}()<br>";
}

示例输出:

位置:/path/to/file.php [第 4 行] --> foo()
总结

本文介绍了如何使用PHP内置函数获取上次发生的错误信息。通过了解PHP的错误报告级别,并使用 error_get_lastset_error_handlerdebug_backtrace 等函数,我们可以快速查看程序的错误信息,定位问题。