1.不使用Dingo Api進自定義Exception的處理方式是php
首先定義Exception類,如AppExceptionsApiExceptionlaravel
namespace App\Exceptions; use Exception; use Throwable; class ApiException extends Exception { public function __construct(string $message = "", int $code = 1, Throwable $previous = null) { parent::__construct($message, $code, $previous); } }
其次在AppExceptionsHandler中針對Exception處理json
public function render($request, Exception $exception)api
{ if ($exception instanceof ApiException) { return response()->json(['status'=>$exception->getCode(), 'msg'=> $exception->getMessage()]);//自定義返回 } return parent::render($request, $exception); }
最後在使用時,throw new ApiException('請求出錯', 123);數組
2.在使用Dingo api處理接口時,發現laravel自己appExceptionsHandler中沒法捕獲異常, render沒法生效了,緣由是Dingo 接管了Exception,解決以下app
首先從新定義一個Handler類ide
namespace App\Exceptions; use Exception; use Dingo\Api\Exception\Handler as DingoHandler; class ApiHandler extends DingoHandler { public function handle(Exception $exception) { if ($exception instanceof ApiException) { return ['status'=>$exception->getCode(), 'msg'=> $exception->getMessage()];//自定義返回,注意此處不能使用response()返回了,由於Dingo封裝處理了,所有當code爲500返回,因此此處應直接返回array, } return parent::handle($exception); } }
其次註冊處理類,可直接在AppProvidersAppServiceProvider->boot函數中添加(本例採用此方法),也能夠自定義一個Provider,而後在config/app.php的providers數組中添加進去函數
public function boot() { // 自定義錯誤處理 $this->app->alias('api.exception', 'App\Exceptions\ApiHandler'); $this->app->singleton('api.exception', function ($app) { return new \App\Exceptions\ApiHandler($app['Illuminate\Contracts\Debug\ExceptionHandler'], $app['config']['api.errorFormat'], $app['config']['api.debug']); }); }
最後在使用時,throw new ApiException('請求出錯', 123);this