Yaf 框架捕捉异常

  1. **开启异常捕获:**YAF框架配置文件conf/application.ini中设置 application.dispatcher.catchException =1

  2. 当使用 Yaf 框架搭建应用时,可以在 ErrorController 类中编写捕捉异常的代码逻辑。

    在该类中,可以通过重写 errorAction() 方法来处理异常情况。以下是一个示例,展示了如何在 ErrorController 类中编写捕捉异常的代码逻辑:

class ErrorController extends Yaf_Controller_Abstract
{
    /**
     * 通过$request->getException()获取到发生的异常
     */
    public function errorAction($exception)
    {

        $code = $exception->getCode();
        $message = $exception->getMessage();
        $file = $exception->getFile();  // 报错文件
        $line = $exception->getLine();  // 文件报错位置的行号
        $trace = $exception->getTrace();  // 报错信息,数组格式
        $traceAsString = $exception->getTraceAsString();  // 报错信息字符串
        
        $err_msg = '';
        switch ($code) {
            case YAF_ERR_DISPATCH_FAILED:
                // 514- 将请求分发到指定的控制器或方法时 分发失败
                $err_msg = '分发失败';
                break;
            case YAF_ERR_NOTFOUND_MODULE:
                // 515 - 当找不到请求的模块时抛出的错误。
                $err_msg = '请求模块不存在';
                break;
            case YAF_ERR_NOTFOUND_CONTROLLER:
                // 516 - 当找不到请求的控制器时抛出的错误。
                $err_msg = '请求控制器不存在';
                break;
            case YAF_ERR_NOTFOUND_ACTION:
                // 517 - 当找不到请求的方法时抛出的错误
                $err_msg = '请求控制器下方法不存在';
                break;
            case YAF_ERR_NOTFOUND_VIEW:
                // 518 - 当找不到请求的视图文件时抛出的错误
                $err_msg = '视图文件不存在';
                break;
            case YAF_ERR_STARTUP_FAILED:
                // 512 - 在启动YAF应用程序时发生了错误,可能由于初始化配置或资源失败导致的问题
                $err_msg = '应用程序启动失败,请检查初始化配置以及加载资源';
                break;
            case YAF_ERR_ROUTE_FAILED:
                // 513 在路由过程中出现了错误,可能是由于没有匹配到对应的路由规则,或者路由规则配置不正确等情况
                $err_msg = '路由错误,请检查相关配置';
                break;
            case YAF_ERR_CALL_FAILED:
                // 519 - 在调用控制器或操作方法时发生了错误。这可能是由于调用的控制器或操作方法不存在、参数不正确或其他异常情况导致的.
                $err_msg = '控制器或方法调用异常';
                break;
            case YAF_ERR_AUTOLOAD_FAILED:
                // 520 - 在自动加载类文件时出现了错误,可能是由于类文件不存在、命名空间不正确或其他加载问题导致的
                $err_msg = '自动加载类文件失败,请检查文件路径或命名空间';
                break;
            case YAF_ERR_TYPE_ERROR:
                // 521 - 在函数或方法中传递了错误类型的参数
                $err_msg = '函数或方法参数错误';
                break;
            default:
                $err_msg = '未捕捉异常';
        }

       
        $request_uri = $_SERVER['REQUEST_URI'];   // 请求地址不带域名
        $log = "[" . date('Y-m-d H:i:s') . "]\r\n";
        $log .= "请求地址: " . $_SERVER['REQUEST_URI'] . "\r\n";
        $log .= "请求参数:" . http_build_query($_REQUEST) . "\r\n";
        $log .= "报错内容: {$err_msg}\r\n";
        $log .= "错误码: " . $code . "\r\n";
        $log .= "错误信息: " . $message . "\r\n";
        $log .= "报错文件: " . $file . "\r\n";
        $log .= "报错行号: " . $line . "\r\n";
        $log .= "Trace: \r\n" . $traceAsString . "\r\n\r\n";

        // 过滤不需要记录报错的请求地址
        $filter_url_arr = [
            '/api/user/demo',
        ];
        if (!in_array($request_uri, $filter_url_arr)) {
            $log_file = APP_PATH . '/logs/error/error_' . date('Ymd') . '.txt';
            file_put_contents($log_file, $log, FILE_APPEND);
        }

        $data = [
            'code' => 0,
            'msg'  => 'error',
            'data' => [
                'code'    => $code,
                'err_msg' => $err_msg,
                'message' => $message,
                'file'    => $file,
                'line'    => $line,
                'trace'            => $trace,
                'getTraceAsString' => $traceAsString
            ]
        ];
        echo json_encode($data);
        die;
    }
}

在上面的示例中,errorAction() 方法首先获取传递给错误控制器的异常对象和错误代码。然后,它检查异常对象的类型,如果是 Exception 类的实例,表示出现了未捕获的异常。在这种情况下,可以执行自定义的异常处理逻辑,例如记录日志或向用户显示友好的错误信息。

  1. 捕获应用程序中未被框架捕获的异常

文件: app/Bootstrap.php

/**
     *  初始化错误处理函数
     * @param Yaf_Dispatcher $dispatcher
     */
    public function _initErrorHandle(Yaf_Dispatcher $dispatcher)
    {
        // 设置调度器的错误处理函数
        $dispatcher->setErrorHandler(array(get_class($this),'customErrorHandler'), E_ALL);
    }
    
    /**
     *  自定义异常捕获函数
     * @param $errno - 报错级别
     * @param $errstr - 报错内容
     * @param $errfile - 报错文件
     * @param $errline - 报错文件行号
     * @return false
     */
    public function customErrorHandler($errno, $errstr, $errfile, $errline)
    {
        // 抛出异常
        throw new ErrorException($errstr, 50001, $errno, $errfile, $errline);
        // 继续执行默认的错误处理机制
        return false;
    }

更多内容请查看原文

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

witkey_ak9896

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值