• tp6异常自定义类接管


    异常处理接管

    本着严谨的原则,框架会对任何错误(包括警告错误)抛出异常。系统产生的异常和错误都是程序的隐患,要尽早排除和解决,而不是掩盖。对于应用自己抛出的异常则做出相应的捕获处理。

    1.框架支持异常处理由开发者自定义类进行接管,需要在app目录下面的provider.php文件中绑定异常处理类,例如:

        // 绑定自定义异常处理handle类
        'thinkexceptionHandle' => appexceptionApiExceptionHandle::class,

    2.自定义类需要继承thinkexceptionHandle并且实现render方法,可以参考如下代码:

    class ApiExceptionHandle extends Handle
    {
        /**
         * 记录异常信息(包括日志或者其它方式记录)
         *
         * @access public
         * @param Throwable $exception
         * @return void
         */
        public function report(Throwable $exception): void
        {
            // 使用内置的方式记录异常日志
            parent::report($exception);
        }
    
        /**
         * Render an exception into an HTTP response.
         *
         * @access public
         * @param 	hinkRequest $request
         * @param Throwable $e
         * @return Response
         */
        public function render($request, Throwable $e): Response
        {
            $massageData = Env::get('app_debug', false) ? [
                'file' => $e->getFile(),
                'line' => $e->getLine(),
                'trace' => $e->getTrace(),
                'previous' => $e->getPrevious(),
            ] : [];
    
            // 添加自定义异常处理机制
            if ($e instanceof DbException) {
                return json($e->getCode(),'数据获取失败', $massageData);
            } elseif ($e instanceof AuthException || $e instanceof ValidateException || $e instanceof ApiException) {
                return json($e->getCode() ?: 400, $e->getMessage());
            } elseif ($e instanceof AdminException) {
                return json($e->getCode(),$e->getMessage(), $massageData);
            } else {
                return json(400001,'未知错误');
            }
        }
    
    }        

    上面的操作后,其实如果其他逻辑抛出异常,这个类是会响应到的. 

    如果抛出  throw new appexceptioncusException([10006,'自定义异常消息']);//这个异常类的构造函数可以自己实现

    ApiExceptionHandle这个类是可以响应的,执行查不到这个异常,返回 json(400001,'未知错误');

    3.现在我们实现异常类(自定义的异常类),

    /**
     * 
     * @package crmebexceptions
     */
    class AdminException extends RuntimeException
    {
        public function __construct($message, $code = 0, Throwable $previous = null)
        {
            if(is_array($message)){
                $errInfo = $message;
                $message = $errInfo[1] ?? '未知错误';
                if ($code === 0) {
                    $code = $errInfo[0] ?? 400;
                }
            }
    
            parent::__construct($message, $code, $previous);
        }
    }

    4.至此,我们如果在controller或Service手动抛出异常,就会返回json

    throw new appexceptionAdminException([400,'后台异常']);
    //抛出后台异常,会被handle方法对应的if else处理返回json 

    5.拓展:其实这样已经可以了,如果抛异常就像第四那样写,但有时为了统一,错误的code都是统一写在一个文件,如:

    ExErrorCode.php

    /**
     * 错误码统一存放类
     * Class ExErrorCode
     */
    class ExErrorCode
    {
        const SUCCESS = [200, 'SUCCESS'];
        const ERROR = [400, 'ERROR'];
        const ERR_LOGIN_INVALID = [410000, 'Landing overdue'];
        //登出
        const LOGIN_OUT = [410008,'登出'];
    }

    最后这样抛出异常:

    throw new appexceptionAdminException(ExErrorCode::LOGIN_OUT);
    //抛出后台异常,会被handle方法对应的if else处理返回json 

    转 : https://www.kancloud.cn/manual/thinkphp6_0/1037615#_29

  • 相关阅读:
    CSS背景background、backgroundposition使用详解
    为何img、input等内联元素可以设置宽、高
    各种Js封装
    CSS布局奇淫技巧之各种居中
    document.compatMode属性
    jquery的each()详细介绍
    jQuery所支持的css样式
    js,jQuery获取html5的data*属性
    PHP中MVC的编程思想浅谈
    php读取xml的神器
  • 原文地址:https://www.cnblogs.com/fps2tao/p/15184054.html
Copyright © 2020-2023  润新知