一、PHP错误和异常的区别
1、错误(Error):由PHP内部引擎和扩展程序引发,或通过trigger_error()抛出的错误。
2、异常(Exception):可预见且可处理的错误情况,由开发人员手动创建并抛出。
3、Error和Exception都实现了Throwable接口,大部分Error和所有Exception都可以使用catch (Throwable $e)同时捕获它们。
二、PHP中的错误处理机制
PHP中的错误类型分类
预定义常量对应不同的错误类型分类(error_type)如下:
内置的错误处理相关配置
error_reporting = error_type:设置显示的错误类型。也可以通过函数error_reporting(int $error_type)在 PHP 程序中动态设置。
display_errors = Off|On:设置是否将错误信息作为输出的一部分显示到屏幕,或者隐藏。(线上环境建议设置为 Off)
log_errors = Off|On:设置错误日志开启或关闭。
log_errors_max_len = 1024:设置错误日志最大长度。
error_log = /usr/local/error.log:设置错误日志文件的位置。
trigger_error触发错误
trigger_error(string $error_msg, int $error_type = E_USER_NOTICE):设置产生一个用户级别的错误(E_USER 系列常量对应的错误),默认是 E_USER_NOTICE。
error_msg:该错误的具体信息,长度限制为 1024 个字节,超出会被截断。
error_type:该错误所特定的错误类型。
该函数抛出的错误会被 set_error_handler 捕获,不会被 set_exception_handler 或 try/catch 捕获。
用set_error_handler自定义函数捕获错误信息
set_error_handler(callable $error_handler, int $error_types = E_ALL | E_STRICT):该函数可以设置用户自定义的函数(error_handler)来处理 PHP 程序中出现的错误。以下类型的错误不能由用户定义的函数来处理:E_ERROR、E_PARSE、E_CORE_ERROR、E_CORE_WARNING、E_COMPILE_ERROR、E_COMPILE_WARNING。
用户自定义的函数(error_handler)的参数和用法:
$error_type:错误类型。
$errstr:错误信息。
$errfile:产生错误的文件地址。
PHP中异常的处理机制
throw语句抛出异常
如果异常没有被try/catch捕获并处理,程序会终止并报出致命错误。
被try/catch捕获后,程序可以继续执行;被set_exception_handler捕获后,程序会终止。
使用set_exception_handler捕获异常
set_exception_handler(callable $exception_handler):设置默认的异常处理函数。
可以捕获大部分错误和异常,但不能捕获警告和通知类型的错误。
使用try/catch/finally捕获异常
<?php // 定义一个自定义异常类,继承自 Exception class ExitApp extends Exception { } // 模拟一个可能抛出异常的函数 function riskyFunction() { // 触发一个通知和一个警告来测试 $undefinedVariable; // 这将触发一个 E_NOTICE isset($someArray["nonExistentKey"]); // 这将触发一个 E_WARNING // 抛出一个 Throwable 类型的异常 // 这通常用于捕获所有类型的错误和异常 // 以下代码示例不会有效,因为 Throwable 是一个抽象类,不能直接实例化 // throw new Throwable("This will not work, as Throwable cannot be instantiated directly."); // 抛出一个自定义的 Exception 子类异常 // 假设 CustomException 是 Exception 的一个子类,如果没定义将被Throwable捕获 //throw new CustomException("A custom exception occurred."); // 这里模拟抛出一个自定义的 ExitApp 异常 // 这将触发 try 块外的 catch 块 //throw new ExitApp("模拟抛出一个自定义的 ExitApp 异常."); //throw new Exception("A general exception occurred."); } // 尝试执行可能抛出异常的代码 try { // 调用可能抛出异常的函数 riskyFunction(); // 这里可以添加更多代码,如果这些代码中抛出了 Exception 类型的异常 // 它们将被 catch (Exception $exception) 块捕获 } catch (ExitApp $exit_app) { // 捕获自定义的 ExitApp 异常 echo "捕获自定义的 ExitApp 异常: " . $exit_app->getMessage() . "\n"; // 这里可以添加处理 ExitApp 异常的特定逻辑 } catch (Exception $exception) { // 捕获其他所有 Exception 类型的异常 echo "捕获自定义的 Exception 类型 异常: " . $exception->getMessage() . "\n"; // 这里可以添加处理其他异常的通用逻辑 } catch (Throwable $t) { // 捕获所有 Throwable 类型的异常或错误,包括 Exception 之外的错误类型 echo "捕获自定义的 Throwable 类型 异常" . $t->getMessage() . "\n"; // 这里可以添加处理严重错误的逻辑 // 注意:此处通常不会到达,除非抛出了非 Exception 类型的错误 } finally { // 无论是否发生异常,finally 块都会执行,但 die 和 exit 后不会执行 finally echo "finally 块,但 die 和 exit 后不会执行 finally.\n"; // 这里可以添加清理资源的代码,如关闭数据库连接、文件句柄等 // 也可以记录日志等 } // 程序继续执行,即使之前有异常发生 echo "程序继续执行,即使之前有异常发生.\n";
全局错误捕获,
自定义捕获函数
set_error_handler 用户自定义的错误处理函数,E_ERROR、E_PARSE之类的错误并不能被用户处理,只能捕获系统产生的一些Warning、Notice级别的错误。
set_exception_handler 用户自定义的异常处理函数,可以处理E_ERROR函数,如执行未定义函数
register_shutdown_function 当页面被用户强制停止时
在 PHP 中,错误类型分为几种,包括但不限于:
E_ERROR:运行时致命错误。这些错误会导致脚本立即停止执行。
E_WARNING:运行时警告。这些错误表明有事情出错了,但脚本仍然继续执行。
E_NOTICE:运行时通知。这些通常是由于变量被赋予了意外的值。
PHP 的 try...catch 语句只能捕获 Exception 对象,这意味着它不能捕获像 E_WARNING 或 E_NOTICE 这样的错误。要捕获这些类型的错误,你需要使用自定义的错误处理函数,通过 set_error_handler 函数来实现。
自定义删除
restore_error_handler():
这个函数用于恢复为前一个错误处理程序,也就是在 set_error_handler() 调用之前设置的错误处理程序。
当你设置了一个自定义的错误处理函数后,可能在某些情况下需要恢复到 PHP 的默认错误处理行为。使用 restore_error_handler() 可以撤销之前通过 set_error_handler() 设置的自定义错误处理器,恢复到默认的错误报告机制。
set_error_handler("customErrorHandler"); // 执行一些代码... restore_error_handler(); // 之后的代码将使用 PHP 的默认错误处理 error_clear_last():
这个函数用于清除 PHP 最后一次的错误信息。
在默认情况下,PHP 会保留最后一次错误的状态,这个状态可以通过 error_get_last() 函数获取。使用 error_clear_last() 可以清除这个错误状态,这样 error_get_last() 将不会返回任何信息。
// 触发一个错误 trigger_error("A test error", E_USER_WARNING); // 获取最后一次错误 $lastError = error_get_last(); // 清除最后一次错误 error_clear_last(); // 再次尝试获取最后一次错误,将不会得到任何结果 $lastError = error_get_last(); // 将为空
restore_error_handler() 主要用于错误处理的上下文管理,确保错误处理可以在不同的代码段中灵活切换。
而 error_clear_last() 则用于清除错误状态,通常在你已经处理了最后一次错误并希望清除其记录时使用。
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
关注微信公众号:"cq_xifan";