API的錯誤處理
正常結果 Response
當我們在定義一個函數接口的時候,往往會定義:
- 接口名
- 輸入參數 Reqest
- 返回結果 Response
以java為例夜矗,登陸接口定義會是類似:
User login(String username, String password);
異常結果 BizError
上述的接口定義妆偏,其實是不妥的我磁,因為它定義了所謂的Happy Path 主流程需要的正常結果 Response
圃阳;卻沒有定義Sad Path 分支流程所需要的異常結果 Biz Error
厌衔。
需要注意的是:主流程
與分支流程
都屬于業(yè)務邏輯的一部分,給與分支流程
足夠的重視捍岳,是軟件成熟度提升的表現富寿。
登陸是完全可能出現分支流程
的,比方說锣夹,用戶名/密碼錯誤页徐,賬號被屏蔽等等;一個連密碼錯誤處理不了的登陸程序银萍,是非常糟糕的程序泞坦。
所以,API的定義可以調整為:
User login(String username, String pass) throw InvalidLoginException, AccountBannedException;
當然砖顷,我們也可以把InvalidLoginException
跟AccountBannedException
都歸為LoginError
,然后使用Enum枚舉
屬性來區(qū)分赃梧,那么接口會變成:
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
的區(qū)別在于后者是針對單一API的巷折,而前者則可能會存在于大部分压鉴,甚至所有API。
BizError
是由對當前的API提供方的業(yè)務代碼返回锻拘,需要調用方針對返回的BizError
進行處理油吭,然后進入當前業(yè)務的分支流程
,這樣的流程是需要我們根據業(yè)務進行特定編碼署拟;它是與業(yè)務邏輯代碼強相關的婉宰。
而CommonError
被返回時,則可能是跟具體業(yè)務無關推穷,它一般是由API提供方使用的框架心包、中間件直接返回的,調用方收到CommonError
時馒铃,可能不會進入業(yè)務的分支流程
蟹腾,而是進行一些同樣的處理痕惋,比方說,提示用戶登錄后操作岭佳,或者重新輸入血巍。
它需要被底層綁定的通用代碼,而不是當前的業(yè)務代碼處理珊随。
錯誤 Error
程序運行的時候述寡,是可能遇到比異常更加嚴重的Error
,比方說:TimeOutError
叶洞、OutOfMemeryError
鲫凶,甚至SegmentFaultError
等等。
API遇到錯誤的時候衩辟,無論是提供方還是調用方螟炫,幾乎都無法進行任何具體處理,最多由通用代碼打一下日志艺晴,然后提示一下用戶稍后重試昼钻。
我們只有把:
- 正常結果
- 異常結果
- 常見異常
- 錯誤
一個成熟的API,需要對這四種四者都考慮進去封寞。
總結
正常結果 | 異常結果 | 常見異常 | 錯誤 | |
---|---|---|---|---|
業(yè)務 | 強相關 | 強相關 | 弱相關 | 無關 |
返回者 | 業(yè)務代碼 | 業(yè)務代碼 | 框架/中間層 | 其它 |
處理者 | 業(yè)務代碼 | 業(yè)務代碼 | 通用代碼 | 通用代碼 |
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 |
下一節(jié)然评,我會推薦一種通用的API框架/風格 - protoapi
,鼓勵按正常結果
狈究、異常結果
碗淌、常見異常
、錯誤
這四種劃分來定義我們的API抖锥。