正常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 協議》,轉載必須註明作者和本文連結