異常處理
1. 前言
本小節(jié)主要介紹如何處理異常錯(cuò)誤情況,正確處理異??梢宰尳涌诟佑押?,如出現(xiàn)報(bào)錯(cuò),通常會(huì)出現(xiàn) 500
錯(cuò)誤,異常處理之后可以返回 200
,錯(cuò)誤內(nèi)容只需在返回?cái)?shù)據(jù)中體現(xiàn)。如返回?cái)?shù)據(jù)中定義 code
字段,然后 code
字段不同的值就是告訴接口使用者發(fā)生了什么類型的錯(cuò)誤,比如 code=401
表示權(quán)限不足,code=500
表示后端代碼層面內(nèi)部錯(cuò)誤,這樣就可以更友好的提示用戶使用。
2. 定義路由
下面給出異常捕獲測試的路由定義如下:
//異常捕獲測試
Route::get('exception-test','app\controller\Study\ExceptionController@testException');
如下圖所示:
3. 定義路由指定的控制器和方法
在 app\controller\Study
中新建 ExceptionController
控制器和 testException
方法:
<?php
namespace app\controller\Study;
use app\BaseController;
use app\Service\StudentService;
use think\facade\Log;
class ExceptionController extends BaseController
{
public function testException()
{
try{
$studentService = new StudentService();
$studentService->update();
}catch(\Exception $exception){
Log::write($exception->getMessage(),'test');
return json("內(nèi)部錯(cuò)誤:".$exception->getMessage());
}
return json("請(qǐng)求成功");
}
}
如下圖所示:
其中 StudentService
類的定義代碼如下:
<?php
namespace app\Service;
use app\Models\Study\StudentModel;
use think\Exception;
class StudentService
{
public function update($id = 1){
try {
$student = StudentModel::where('id',$id)->find();
//這里修改主鍵 id 的值,并保存會(huì)報(bào)錯(cuò)
$student->id = "test";
$student->save();
}catch(\Exception $e){
throw new Exception("數(shù)據(jù)保存失敗:".$e->getMessage());
}
}
}
Tips: 上述代碼是為了演示方便故意寫的一個(gè)報(bào)錯(cuò)代碼,目的是為了異常捕獲。
4. 請(qǐng)求接口
在 postman
中請(qǐng)求接口,返回?cái)?shù)據(jù)如下:
Tips: 如圖所示可以使用異常捕獲之后,可以防止由于代碼邏輯錯(cuò)誤導(dǎo)致的內(nèi)部
500
,從而返回友好的200
,上述展示的是多層異常捕獲。
5. 主動(dòng)拋出異常
上述 StudentService
類中 update
方法也可以定義如下方式主動(dòng)拋出異常:
public function update($id = 0){
if(!$id){
throw new Exception("id必須大于0");
}
$student = StudentModel::where('id',$id)->find();
if(empty($student)){
throw new Exception("學(xué)生信息不存在");
}
}
如下圖所示:
此時(shí)再調(diào)用接口返回如下圖:
6. 小結(jié)
本小節(jié)介紹了如何使用異常捕獲,異常捕獲可以有效地捕捉多層調(diào)用關(guān)系的內(nèi)部異常,當(dāng)內(nèi)部代碼出現(xiàn)報(bào)錯(cuò)情況時(shí),在控制器入口處捕獲異??梢杂行У刈柚?500
錯(cuò)誤碼,然后返回更加友好的 200
狀態(tài)碼。
Tips: 代碼倉庫:https://gitee.com/love-for-poetry/tp6