自定义错误捕捉函数register_shutdown_function

try catch 捕捉不到的异常或者错误,可以使用这个函数捕捉到,当然 E_USER_ERROR 级别的错误,程序是一定会停止的

  • 演示是模仿 tp 获取最后一段 mysql 执行语句
常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE run-time 通知。在脚本发现可能有错误时发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告。(在 PHP 5.4 中,E_STRICT 成为 E_ALL 的一部分)
<?php
class Db
{
    function getLastSql()
    {
        return "select * from user";
    }
}
$db = new Db();
register_shutdown_function(
    function () {
        $param = func_get_args();
        // var_dump($param);
        $param[1]();
        // echo $param[1]->getLastSql();
        $error = error_get_last();
        var_dump($error);
        if ($error) {
            // 获取错误信息
            $param = func_get_args();
            // var_dump($param);
            echo "发生致命错误:" . $error["message"] . ",错误代码:" . $error["type"] . ",错误文件:" . $error["file"] . ",错误行号:" . $error["line"];
        }
    },
    E_ALL,
    // $db);

    function () use ($db) {
        echo $db->getLastSql();
    }
);
try {
    trigger_error('User Error', E_USER_ERROR);
} catch (\Exception $e) {
    echo $e->getMessage();
} catch (\Error $e) {
    echo $e->getMessage();
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
reading
白小二
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!