PHP异常的捕获及处理

作者: 新亮笔记 | 来源:发表于2016-08-08 17:24 被阅读1236次

    系统自带异常处理

    <?php
    header("Content-type:text/html;charset=utf-8");
    try
    {
        //业务处理 错误时抛出异常。
        $age = 130;
        if ($age > 120) {
            throw new Exception('年龄不能大于120岁。', 1001);
        }
    } catch (Exception $e) {
        $err = [
            'code' => $e->getCode(),
            'msg'  => $e->getMessage(),
            'file'    => $e->getFile(),
            'line'   => $e->getLine()
        ];
        echo json_encode($err);
    }
    
    输出:{"code":1001,"msg":"\u5e74\u9f84\u4e0d\u80fd\u5927\u4e8e120\u5c81\u3002","file":"\/data\/mi\/demo.php","line":11}
    
    

    自定义异常处理

    <?php
    header("Content-type:text/html;charset=utf-8");
    class proException extends Exception
    {
        //根据业务需求,自定义方法
        /**
         * 获取错误信息
         * @param int $type 类型 1=json 2=数组
         * @return array
         */
        public function getErrorInfo($type = 2)
        {
            $err = [
                'code' => $this->getCode(),
                'msg'  => $this->getMessage(),
                'file'    => $this->getFile(),
                'line'   => $this->getLine()
            ];
            if ($type == 1) {
                return json_encode($err);
            }
            return $err;
        }
    }
    
    try
    {
        //业务处理 错误时抛出异常。
        $age = 130;
        if ($age > 120) {
            throw new proException('年龄不能大于120岁。', 1001);
        }
    } catch (proException $e) {
        $info = $e->getErrorInfo();
        var_dump($info);
    }
    
    输出:array(4) { ["code"]=> int(1001) ["msg"]=> string(27) "年龄不能大于120岁。" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(53) }
    
    

    捕捉多个异常

    <?php
    header("Content-type:text/html;charset=utf-8");
    class proException extends Exception
    {
        //根据业务需求,自定义错误方法
    
        /**
         * 获取错误信息
         * @param int $type 类型 1=json 2=数组
         * @return array
         */
        public function getErrorInfo($type = 2)
        {
            $err = [
                'code' => $this->getCode(),
                'msg'  => $this->getMessage(),
                'file'    => $this->getFile(),
                'line'   => $this->getLine()
            ];
            if ($type == 1) {
                return json_encode($err);
            }
            return $err;
        }
    }
    
    try
    {
        if ($_GET['age'] > 100) {
            throw new proException('自定义的异常处理', 1002);
        } else {
            throw new Exception('系统的异常处理', 1002);
        }
    } catch (proException $e) {
        $info =  $e->getErrorInfo();
        var_dump($info);
    } catch (Exception $e) {
        echo $e->getMessage();
    }
    
    ?age=110 输出:array(4) { ["code"]=> int(1002) ["msg"]=> string(24) "自定义的异常处理" ["file"]=> string(17) "/data/mi/demo.php" ["line"]=> int(64) }
    ?age=20 输出:系统的异常处理。
    
    

    日志记录

    //禁止错误输出
    error_reporting(0);
    //设置错误处理器
    set_error_handler('errorHandler');
    //在脚本结束时运行的函数
    register_shutdown_function('fatalErrorHandler');
    
    /**
     * 错误处理
     * @param int    $err_no      错误代码
     * @param string $err_msg  错误信息
     * @param string $err_file    错误文件
     * @param int    $err_line     错误行号
     * @return string
     */
    function errorHandler($err_no = 0, $err_msg = '', $err_file = '', $err_line = 0)
    {
        $log = [
            '['.date('Y-m-d h-i-s').']',
            '|',
            $err_no,
            '|',
            $err_msg,
            '|',
            $err_file,
            '|',
            $err_line
        ];
        $log_path = '/data/mi/test.txt';
        error_log(implode(' ',$log)."\r\n",3, $log_path);
        //echo implode(' ',$log)."<br>";
    }
    
    /**
     * 捕捉致命错误
     * @return string
     */
    function fatalErrorHandler() {
        $e = error_get_last();
        switch ($e['type']) {
            case 1:
                errorHandler($e['type'], $e['message'], $e['file'], $e['line']);
                break;
        }
    }
    
    class DemoClass_1
    {
        public function index()
        {
            //这里发生一个警告错误,出发errorHandler
            echo $undefinedVarible;
        }
    }
    
    $demo_1 = new DemoClass_1();
    //这里发生一个警告错误,被errorHandler 捕获
    $demo_1->index();
    //发生致命错误,脚本停止运行触发 fatalErrorHandler
    $demo_2 = new DemoClass_2();
    $demo_2->index();
    
    打开echo后 输出:
    [2016-08-07 09-01-34] | 8 | Undefined variable: undefinedVarible | /data/mi/demo.php | 126
    [2016-08-07 09-01-34] | 1 | Class 'DemoClass_2' not found | /data/mi/demo.php | 134
    

    备注:

    • register_shutdown_function 也可以用于API调试中,记录每次请求值和返回值,方便调试。
    • 利用 “|” 分割的好处是,便于利用 awk 对日志进行分割处理。

    Thanks ~

    AD:


    PHP工程师订阅号

    相关文章

      网友评论

      本文标题:PHP异常的捕获及处理

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