TP5接口開發之異常處理接管


前幾天在開發的時候用到了第三方的擴展包,使用過程中第三方擴展包拋出了異常

因為這邊是接口開發,需要返回錯誤代碼以及提示信息等,所以就需要接管異常處理。

此文章只做筆記,有不對或不詳細的地方歡迎大家留言交流。

首先先在application下創建目錄exception

然后創建BaseException類,此類為自定義異常類基類,繼承框架異常類或php異常類都可。

 

<?php
/**
 * BaseException.php
 * 文件描述:自定義異常類基類,繼承框架異常類
 */

namespace app\common\exception;


use think\Exception;
use Throwable;

/**
 * Class BaseException
 * 自定義異常類的基類
 * @package app\common\exception
 */
class BaseException extends Exception
{
   public function __construct($message = "", $code = 0, Throwable $previous = null)
   {
       parent::__construct($message, $code, $previous);
   }
}

 

 

這里重寫父類的構造方法,然后調用父類的構造方法,這塊我看的有點迷,歡迎大家留言分享。

手冊上寫了,框架支持異常頁面由開發者自定義類進行處理,需要配置參數exception_handle

// 異常處理handle類 留空使用 \think\exception\Handle
'exception_handle'       => '\\app\\common\\exception\\Http',

自定義類需要繼承Handle並且實現render方法,手冊參考:https://www.kancloud.cn/manual/thinkphp5/126075

<?php
/**
 * ExceptionHandler.php
 * 文件描述:重寫后的異常處理類
 */

namespace app\common\exception;

use DawnApi\exception\UnauthorizedException;
use Exception;
use think\exception\Handle;
use think\Log;

class ExceptionHandler extends Handle
{
    private $code;//http狀態碼
    private $msg;//異常消息
    private $errorCode;//異常狀態碼

    public function render(Exception $e)
    {
        if ($e instanceof BaseException)
        {
            //使用instanceof判斷異常是否為自定義異常
           $this->code = 200;
           $this->msg = $e->getMessage();
           $this->errorCode = $e->getCode();
        } elseif ($e instanceof UnauthorizedException) {
            //使用instanceof判斷異常是否為第三方擴展包異常
            $this->code =200;
            $this->errorCode = 401;
            $this->msg = '授權失敗';
        } else {
            //其他異常
            $this->errorCode = 10003;
            $this->msg = '操作失敗';
        }
        $this->recordErrorLog($e);//將異常寫入日志,方便查看
        return json(['code'=>$this->errorCode,'msg'=>$this->msg]);
    }

    /**
     * Notes:將異常寫入日志
     * @param Exception $e
     */
    private function recordErrorLog(Exception $e) {
        Log::init([
            'type' => 'File',
            'path' => LOG_PATH,
            'level' => ['error'],
        ]);
        Log::record([
            '錯誤文件' => $e->getFile(),
            '錯誤行數' => $e->getLine(),
            '錯誤代碼' => empty($this->code) ? $e->getCode() : $this->code,
            '錯誤消息' => empty($this->message) ? $e->getMessage() : $this->message,
        ], 'error');
    }
}

 


免責聲明!

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



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