API的設計(1) - 錯誤處理
API的錯誤處理
正常結果 Response
當我們在定義一個函式介面的時候,往往會定義:
- 介面名
- 輸入引數 Reqest
- 返回結果 Response
以java為例,登陸介面定義會是類似:
User login(String username, String password);
異常結果 BizError
上述的介面定義,其實是不妥的,因為它定義了所謂的Happy Path 主流程需要的正常結果 Response
;卻沒有定義Sad Path 分支流程所需要的異常結果 Biz Error
。
需要注意的是:主流程
與分支流程
都屬於業務邏輯的一部分,給與分支流程
足夠的重視,是軟體成熟度提升的表現。
登陸是完全可能出現分支流程
的,比方說,使用者名稱/密碼錯誤,賬號被遮蔽等等;一個連密碼錯誤處理不了的登陸程式,是非常糟糕的程式。
所以,API的定義可以調整為:
User login(String username, String pass) throw InvalidLoginException, AccountBannedException;
當然,我們也可以把InvalidLoginException
跟AccountBannedException
都歸為LoginError
,然後使用Enum列舉
屬性來區分,那麼介面會變成:
enum ErrorTypes {
InvalidLogin = 1;
AccountBanned = 2;
}
Class LoginError {
ErrorTypes Error;
}
User login(String username, String pass) throw LoginError;
常見異常 CommonError
但這依舊不夠,我們實現介面的時候,往往會使用一些框架、中介軟體,而它們自身又經常帶有一些內建的常見異常 CommonError
,比方說:
- APIKeyNotProvided
- InvalidParameter
等等,同樣的,我們也可以把上述歸類為CommonError
,那麼API定義會變成:
enum ErrorTypes {
InvalidLogin = 1;
AccountBanned = 2;
}
Class LoginException {
ErrorTypes Error;
}
Class FrameworkException {
....
}
User login(String username, String password) throw LoginError, CommonError;
CommonError
與BizError
的區別在於後者是針對單一API的,而前者則可能會存在於大部分,甚至所有API。
BizError
是由對當前的API提供方的業務程式碼返回,需要呼叫方針對返回的BizError
進行處理,然後進入當前業務的分支流程
,這樣的流程是需要我們根據業務進行特定編碼;它是與業務邏輯程式碼強相關的。
而CommonError
被返回時,則可能是跟具體業務無關,它一般是由API提供方使用的框架、中介軟體直接返回的,呼叫方收到CommonError
時,可能不會進入業務的分支流程
,而是進行一些同樣的處理,比方說,提示使用者登入後操作,或者重新輸入。
它需要被底層繫結的通用程式碼,而不是當前的業務程式碼處理。
錯誤 Error
程式執行的時候,是可能遇到比異常更加嚴重的Error
,比方說:TimeOutError
、OutOfMemeryError
,甚至SegmentFaultError
等等。
API遇到錯誤的時候,無論是提供方還是呼叫方,幾乎都無法進行任何具體處理,最多由通用程式碼打一下日誌,然後提示一下使用者稍後重試。
我們只有把:
- 正常結果
- 異常結果
- 常見異常
- 錯誤
一個成熟的API,需要對這四種四者都考慮進去。
總結
正常結果 | 異常結果 | 常見異常 | 錯誤 | |
---|---|---|---|---|
業務 | 強相關 | 強相關 | 弱相關 | 無關 |
返回者 | 業務程式碼 | 業務程式碼 | 框架/中間層 | 其它 |
處理者 | 業務程式碼 | 業務程式碼 | 通用程式碼 | 通用程式碼 |
Response | BizError | CommonError | Error | |
---|---|---|---|---|
Business Relation | Strong | Strong | Weak | N.A. |
Returner | Biz Code | Biz Code | Framework/Middleware | Others |
Handler | Biz Code | Biz Code | General Code | General Code |
下一節,我會推薦一種通用的API框架/風格 - protoapi
,鼓勵按正常結果
、異常結果
、常見異常
、錯誤
這四種劃分來定義我們的API。
相關文章
- Restful API 中的錯誤處理RESTAPI
- go 錯誤處理設計思考Go
- 二、GO 程式設計模式:錯誤處理Go程式設計設計模式
- 深入 Go 的錯誤處理機制,理解設計思想Go
- 錯誤處理
- 如何在 Go 中優雅的處理和返回錯誤(1)——函式內部的錯誤處理Go函式
- go的錯誤處理Go
- axios 的錯誤處理iOS
- Python錯誤處理Python
- PHP 錯誤處理PHP
- php錯誤處理PHP
- Go 錯誤處理Go
- grpc中的錯誤處理RPC
- 從錯誤處理看 Rust 的語言和 Go 語言的設計RustGo
- 錯誤處理:如何通過 error、deferred、panic 等處理錯誤?Error
- openGauss 處理錯誤表
- 請教 Element 的錯誤處理
- 【譯】RxJava 中的錯誤處理RxJava
- Python程式設計中一些常見的錯誤和處理方法Python程式設計
- Python錯誤處理和異常處理(二)Python
- 前端的水平線,錯誤處理和除錯前端除錯
- Oracle異常錯誤處理Oracle
- 淺談前端錯誤處理前端
- ORACLE 異常錯誤處理Oracle
- PHP 核心特性 - 錯誤處理PHP
- 15-錯誤處理(Error)Error
- Go語言之錯誤處理Go
- laravel9 錯誤處理Laravel
- 學習Rust 錯誤處理Rust
- Promise.all API 的出錯處理PromiseAPI
- 談談RxSwift中的錯誤處理Swift
- 基於 React Redux 的錯誤處理ReactRedux
- Go 的錯誤處理策略 筆記Go筆記
- 應用中的錯誤處理概述
- 使用 clearError 清除已處理的錯誤Error
- Bash 指令碼中的錯誤處理指令碼
- 《javascript高階程式設計》學習筆記 | 21.2.錯誤處理JavaScript程式設計筆記
- rust學習十、異常處理(錯誤處理)Rust