笔记:异常处理之report与render

文档:错误处理《Laravel 8 中文文档》

正常web应用部署在生产环境,都必须关闭调试模式,env配置:

APP_ENV=production
APP_DEBUG=false

所以我们就需要对线上的一些报错进行拦截处理,此处以常见的sql异常错误为例。
代码路径:app/Exceptions/Handler.php
说明:
report 方法用于将错误记录到日志文件中(或一些其他操作),注意 dontReport 属性,它设置不应该被记录到日志的异常类。
render 方法是用于将错误渲染(视图或JSON API),当异常发生时,这个方法应响应相关信息给用户。

<?php

namespace App\Exceptions;

use App\Service\HttpService;
use Illuminate\Database\QueryException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Throwable;
use Exception;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * A list of the inputs that are never flashed for validation exceptions.
     *
     * @var array
     */
    protected $dontFlash = [
        'password',
        'password_confirmation',
    ];

    /**
     * Report or log an exception.
     *
     * @param  \Throwable  $exception
     * @throws \Exception
     */
    public function report(Throwable $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Throwable  $exception
     * @return \Symfony\Component\HttpFoundation\Response
     *
     * @throws \Throwable
     */
    public function render($request, Throwable $exception)
    {
        if (config('app.debug')) {
            parent::report($exception);
        }

        //针对不同异常进行拦截
        if ($exception instanceof QueryException) {
            return HttpService::error('Sql出现未知错误');
        }

        if ($exception instanceof Exception) {
            $code = $exception->getCode();
            $msg = $exception->getMessage();

            return HttpService::error($msg, [], $code);
        }

        return parent::render($request, $exception);
    }
}

附:HttpService 为同一的接口响应类。

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

建议处理

  • 1.在 render 中,可以将异常传到一个 job 中,在队列里面,接入邮件、短信、钉钉消息、微信公众号消息(具体看公司需求)通知到开发人员
    • 在创建 job 任务前,可以使用缓存来判断10min 以内是否有相同bug已接入通知
  • 2.判断请求方式,来返回页面提示或者 json 格式内容
    • 有必要可根据路由,返回不同的提示
2年前 评论
guanguans 2年前

@请多多指教 你说的是对于异常的后续处理哈。个人建议在自定义的异常处理类中进行处理,如:使用统一的CustomException来做业务层面的异常处理,以便更方便的处理各种异常(如你所说的,传到job、通知开发人员等等)。甚至你可以创建不同的异常通知类:LogException、WeChatException、EmailException等等。。。关于你说的第“2“点很好,是返回页面还是json api,这个肯定要心中有数。可能我太久没碰模板视图了(4年多了吧,都是前后端分离的)

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!