前幾天在開發的時候用到了第三方的擴展包,使用過程中第三方擴展包拋出了異常
因為這邊是接口開發,需要返回錯誤代碼以及提示信息等,所以就需要接管異常處理。
此文章只做筆記,有不對或不詳細的地方歡迎大家留言交流。
首先先在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'); } }