如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留链接信息。

本文中,苏南大叔将对前几篇文章所描述的内容进行最后的加工整理,形成一个终结版的方案。兼容php5和php7,完美捕获demo中所有的错误和异常。

文章链接

相关文章如下:

相关代码

error_handler.php:

//error_reporting(0);
register_shutdown_function(["newsn", "shutdown_handler"]);
set_error_handler(["newsn", "error_handler"]);
set_exception_handler(["newsn", "exception_handler"]);
class newsn {
    public static function shutdown_handler() {
        define('E_FATAL', E_ERROR | E_USER_ERROR | E_CORE_ERROR |
                E_COMPILE_ERROR | E_RECOVERABLE_ERROR | E_PARSE);
        $error = error_get_last();
        if ($error && ($error["type"] === ($error["type"] & E_FATAL))) {
            $errno = $error["type"];
            $errfile = $error["file"];
            $errline = $error["line"];
            $errstr = $error["message"];
            self::error_handler($errno, $errstr, $errfile, $errline);
        }
    }
    public static function exception_handler($exception) {
        $errno = $exception->getCode();
        $errstr = $exception->getMessage();
        $errfile = $exception->getFile();
        $errline = $exception->getLine();
        $errtrace = $exception->getTraceAsString();
        self::error_handler($errno, $errstr, $errfile, $errline);
    }
    public static  function error_handler($errno, $errstr, $errfile, $errline) {
        echo "<b>出错了,错误如下:</b><br/><br/>";
        echo "代码: $errno <br />\n";
        echo "信息: $errstr <br />\n";
        echo "文件: $errfile <br />\n";
        echo "行号: $errline <br />\n";
        return true;
        //return false;
    }
}

index.php:

require "error_handler.php";
echo "PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n";
//throw new Exception('这是个自定义异常exception');
//throw new Exception('这是个带编号的自定义异常exception',1);
//trigger_error("这是个无法捕捉的自定义的错误error");
//throw @new Error('这是个带编号的自定义的错误error',2);
//@this_is_an_on_purpose_error();
echo "恭喜,没有错误\n";

php错误error、exception处理之终极版 - 098

php错误error、exception处理之终极版 - 099

代码说明

这里说明以下几点:

  • 回调函数的传递方式,如果是顶级函数的话,就传递函数名,如果是放置在类里面的话,就传递个数组,类名加函数名。
  • throw@的组合顺序,可能和传统的写法不是太一致。
  • trigger_error会继续执行代码,因为它不是致命的错误,只是个用户自定义错误。如有需要,请主动die()

结语

如果您看过苏南大叔的前几篇文章的话,本篇文章里面的内容,就十分好理解了。根据您的代码实际情况,稍加改变一下逻辑。就可以集成到您的代码里面了。加油!

更多php相关精彩经验文章,请点击这里查看:https://newsn.net/tag/php/

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享。
转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议。
程序如此灵动~》下所有原创文章,如被用于商业用途,请您按规定支付稿费。