背景:
在使用swoft做API接口時候,當出現錯誤拋出異常時往往格式並不是我們需要的,正常來說我們需要的是類似於我們接口統一返回的格式,這種情況下我們需要自定義異常類去處理拋出異常的數據格式。
步驟:
1、swoft的異常類通常放在app/Exception 目錄下,需要定義一個異常類和一個異常處理類,異常類和框架原來的定義的一樣都是定義一個類基礎Exception類即可。
<?php namespace App\Exception; class ApiException extends \Exception { }
2、異常處理類定義在app/Exception/Hander 目錄下,定義一個Handler類,然后繼承 AbstractHttpErrorHandler!這里只要注意的是注解部分的 @
ExceptionHandler(用於捕獲並統一異常!在出錯時不用到處捕獲異常而是在這里會統一處理,參數為異常類)
<?php declare(strict_types=1); /** * This file is part of Swoft. * * @link https://swoft.org * @document https://swoft.org/docs * @contact group@swoft.org * @license https://github.com/swoft-cloud/swoft/blob/master/LICENSE */ namespace App\Exception\Handler; use App\Exception\ApiException; use Swoft\Error\Annotation\Mapping\ExceptionHandler; use Swoft\Http\Message\Response; use Swoft\Http\Server\Exception\Handler\AbstractHttpErrorHandler; use Throwable; /** * Class ApiExceptionHandler * * @since 2.0 * * @ExceptionHandler(ApiException::class) */ class ApiExceptionHandler extends AbstractHttpErrorHandler { /** * @param Throwable $except * @param Response $response * * @return Response */ public function handle(Throwable $except, Response $response): Response { $data = [ 'code' => $except->getCode(), 'msg' => sprintf('(%s) %s', get_class($except), $except->getMessage()), 'data' => sprintf('At %s line %d', $except->getFile(), $except->getLine()), ]; return $response->withData($data); } }
統一拋出異常類的好處:
在做項目的時候為了代碼邏輯清晰,可以在把代碼分層,放到不同的文件處理。如果沒有采用這種異常處理方式,就得在調用處捕獲異常。例如我在 Controller 層調用了 Service 和 Logic 層,每一層都拋出異常,我們需要在控制器捕獲異常,那么我們每次寫代碼都會帶上 try 的代碼。使用統一異常處理,我們不再需要再調用處捕獲,會自動捕獲這個異常並按照開發者的邏輯處理。