首页 > 生活服务 > 程序猿源

程序猿源

PHP之错误和异常处理

管理员 11月前 83浏览

一、PHP错误和异常的区别

1、错误(Error):由PHP内部引擎和扩展程序引发,或通过trigger_error()抛出的错误。

2、异常(Exception):可预见且可处理的错误情况,由开发人员手动创建并抛出。

3、Error和Exception都实现了Throwable接口,大部分Error和所有Exception都可以使用catch (Throwable $e)同时捕获它们。


二、PHP中的错误处理机制

PHP中的错误类型分类

预定义常量对应不同的错误类型分类(error_type)如下:

image.png


内置的错误处理相关配置

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";

评论

收藏

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~

Powered By 重庆饭哥 © 2014-2022 教学资源分享站 渝ICP备20005643号-1

相信有一天,理想主义终将所向披靡.

Design by © 2021 XIFAN. Powered by 重庆饭哥

站点声明: 本站转载作品版权归原作者及来源网站所有,原创内容作品版权归作者所有,任何内容转载、商业用途等均须联系原作者并注明来源。

友情链接: 官方网站 饭哥在线工具 饭哥导航 在线运行 博客交流社区 重庆艺术工程职业学院