美文网首页PHP实战Phalconphp
「PHP开发APP接口实战003」自定义异常处理

「PHP开发APP接口实战003」自定义异常处理

作者: 一念觀心 | 来源:发表于2018-01-04 17:00 被阅读68次

    在实际开发中,错误及异常捕捉仅仅靠try{}catch()是远远不够的。
    为了安全起见,我们使用了两个PHP内置方法 set_error_handlerset_exception_handler 绕过标准的 PHP 错误处理函数,并输出自定义错误消息和记录错误日志。

    记录错误日志

    为了方便调试和查找错误位置,我们在每次拦截到错误信息时,都会将错误信息记录在日志文件里面。

    /**
     * 记录错误日志
     * @param $error_code 错误代码
     * @param $error_message 错误消息
     * @param $error_file 错误文件
     * @param $error_line 错误行
     */
    function log_write($error_code, $error_message, $error_file, $error_line)
    {
        $log = date('Y-m-d H:i:s');
        $log .= ' | ' . '[' . $error_code . '] ';
        $log .= $error_message . PHP_EOL;
        $log .= $error_file . ', line : ' . $error_line . PHP_EOL;
        $filename = LOG_PATH . '/' . date('Ymd') . '.log';
        file_put_contents($filename, $log . PHP_EOL, FILE_APPEND);
    }
    

    错误信息包括:错误时间,错误信息,错误文件,错误所在行。例如:

    2017-12-14 06:42:45 | [2] Division by zero
    D:\Fox\DingDangBike\Code\app\1.0.0\controllers\IndexController.php, line : 7
    

    输出错误信息

    /**
     * 输出错误信息
     * @param $message 错误消息
     * @param $code 错误代码
     * @param string $track 错误位置
     */
    function error_output($message, $code, $track = null)
    {
        $error = [
            'status' => '0',
            'code' => $code . '',
            'message' => $message,
        ];
    
        $options = null;
        $config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
        // 调试开启
        if ($config->debug && $track) {
            $error['track'] = $track; // 输出出错位置信息
            $options = $options | JSON_UNESCAPED_UNICODE; // 中文不转码
        }
        die(json_encode($error, $options));
    }
    

    我们将拦截到的错误信息封装成标准JSON接口格式,再输出到接口页面并终止代码执行。
    这里,我们还配置了是否开启调试,如开启调试功能,会额外输入错误位置信息,以便于开发时调试使用。例如:

    {
        "status": "0",
        "code": "500",
        "message": "Division by zero",
        "track": "D:\\Fox\\DingDangBike\\Code\\app\\controllers\\IndexController.php, line : 17"
    }
    

    自定义错误处理函数

    使用内置函数set_error_handler拦截错误, 并调用log_writeerror_output

    set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
        log_write($error_code, $error_message, $error_file, $error_line);
        error_output($error_message, 500, $error_file . ', line : ' . $error_line);
    });
    

    自定义异常处理函数

    使用内置函数set_exception_handler拦截异常, 并调用log_writeerror_output

    set_exception_handler(function (Exception $e) {
        log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
        error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
    });
    

    完整代码

    路径:/public/exception.php

    <?php
    /**
     * 记录错误日志
     * @param $error_code 错误代码
     * @param $error_message 错误消息
     * @param $error_file 错误文件
     * @param $error_line 错误行
     */
    function log_write($error_code, $error_message, $error_file, $error_line)
    {
        $log = date('Y-m-d H:i:s');
        $log .= ' | ' . '[' . $error_code . '] ';
        $log .= $error_message . PHP_EOL;
        $log .= $error_file . ', line : ' . $error_line . PHP_EOL;
        $filename = LOG_PATH . '/' . date('Ymd') . '.log';
        file_put_contents($filename, $log . PHP_EOL, FILE_APPEND);
    }
    
    /**
     * 输出错误信息
     * @param $message 错误消息
     * @param $code 错误代码
     * @param string $track 错误位置
     */
    function error_output($message, $code, $track = null)
    {
        $error = [
            'status' => '0',
            'code' => $code . '',
            'message' => $message,
        ];
    
        $options = null;
        $config = new Phalcon\Config\Adapter\Php(PHP_CONFIG_PATH);
        // 调试开启
        if ($config->debug && $track) {
            $error['track'] = $track; // 输出出错位置信息
            $options = $options | JSON_UNESCAPED_UNICODE; // 中文不转码
        }
        die(json_encode($error, $options));
    }
    
    set_error_handler(function ($error_code, $error_message, $error_file, $error_line) {
        log_write($error_code, $error_message, $error_file, $error_line);
        error_output($error_message, 500, $error_file . ', line : ' . $error_line);
    });
    
    set_exception_handler(function (Exception $e) {
        log_write($e->getCode(), $e->getMessage(), $e->getFile(), $e->getLine());
        error_output($e->getMessage(), 300, $e->getFile() . ', line : ' . $e->getLine());
    });
    

    相关文章

      网友评论

        本文标题:「PHP开发APP接口实战003」自定义异常处理

        本文链接:https://www.haomeiwen.com/subject/fymilxtx.html