筆記:異常處理之report與render

Diego_crazy發表於2021-09-04

文件:錯誤處理《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 協議》,轉載必須註明作者和本文連結

相關文章