swoft2.x Http異常統一處理


背景:

  在使用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 的代碼。使用統一異常處理,我們不再需要再調用處捕獲,會自動捕獲這個異常並按照開發者的邏輯處理。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM