道者编程

laravel5.8(三)错误,异常处理

一:位置:

laravel的错误处理都是在 app\Exceptions\Handler.php文件中,默认有两个方法

//记录异常log
public function report(Exception $exception) //异常日志默认添加到storage\logs

//异常记录展示,可以是页面或者json等任意格式,默认是转到一个页面
public function render($request, Exception $exception) 

二:瞎搞一下

用json提示异常,我们在做api的时候,总不能用网页报这些错误吧?所以改成json干一干

1:根据异常http code设置

打开这个文件,可以看到在文件的开头use导入了命名空间

use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
 根据这个命名空间找这个文件:vendor\laravel\framework\src\Illuminate\Foundation\Exceptions\Handler.php,OK,app\Exceptions\Handler.php就是继承的该文件,该文件就是父类,我们打开这个父类,这里面有一个方法:

/**
     * Create a Symfony response for the given exception.
     *
     * @param  \Exception  $e
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function convertExceptionToResponse(Exception $e)
    {
        return SymfonyResponse::create(
            $this->renderExceptionContent($e),
            $this->isHttpException($e) ? $e->getStatusCode() : 500,
            $this->isHttpException($e) ? $e->getHeaders() : []
        );
    }
这个方法可以获取到http信息,比如http code。更多信息参考:vendor\symfony\http-foundation\Response.php

现在回到app\Exceptions\Handler.php中,修改:

 /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        // 获取异常Symfony响应
        $error = $this->convertExceptionToResponse($exception);
        // 判断是否有异常http code
        if(!empty($error->getStatusCode())){
            return response(
                [
                    //输出http code异常代码,比如 404,500等等
                    'status_code' => $error->getStatusCode(), 
                    'message' => $this->errorCode($error->getStatusCode()),
                ],
                $error->getStatusCode() //设置真实响应http code,做API的时候也可以不设置
            );
        }
        return parent::render($request, $exception);
    }

    //自定义http响应msg
    private function errorCode(int $code)
    {
        switch ($code) {
            case '404':
                $msg = '请求资源不存在';
                break;

            case '500':
                $msg = '系统异常, 请稍后再试';
                break;
            
            default:
                $msg = '系统异常, 请稍后再试';
                break;
        }
        return $msg;
    }
效果:{"status_code":500,"message":"系统异常, 请稍后再试"}

2:根据返回对象的类名

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $exception
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $exception)
    {
        switch (get_class($exception)) {
            case 'ReflectionException':
                return response([
                    'status_code' => 500,
                    'message' => '系统异常, 请稍后再试',
                ],500);
                break;
            //vendor\symfony\http-kernel\Exception,这一串太长 可以use 写在头部
            case \Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class:
                return response([
                    'status_code' => $exception->getStatusCode(), // 404
                    'message' => '请求资源不存在',
                ],$exception->getStatusCode());
                break;
            
            default:
                # 其他的,比如token过期,没有权限都可以接在后面
                break;
        }
        return parent::render($request, $exception);
    }
 




最新评论:
我要评论:

看不清楚