第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

異常處理

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