API的設計(1) - 錯誤處理

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;

當然砖顷,我們也可以把InvalidLoginExceptionAccountBannedException都歸為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;

CommonErrorBizError的區(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抖锥。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末亿眠,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子磅废,更是在濱河造成了極大的恐慌纳像,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拯勉,死亡現場離奇詭異爹耗,居然都是意外死亡,警方通過查閱死者的電腦和手機谜喊,發(fā)現死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門潭兽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人斗遏,你說我怎么就攤上這事山卦。” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵账蓉,是天一觀的道長枚碗。 經常有香客問我,道長铸本,這世上最難降的妖魔是什么肮雨? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮箱玷,結果婚禮上怨规,老公的妹妹穿的比我還像新娘。我一直安慰自己锡足,他們只是感情好波丰,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著舶得,像睡著了一般掰烟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沐批,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天纫骑,我揣著相機與錄音,去河邊找鬼九孩。 笑死先馆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的捻撑。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼缤底,長吁一口氣:“原來是場噩夢啊……” “哼顾患!你這毒婦竟也來了?” 一聲冷哼從身側響起个唧,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤江解,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后徙歼,有當地人在樹林里發(fā)現了一具尸體犁河,經...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年魄梯,在試婚紗的時候發(fā)現自己被綠了桨螺。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡酿秸,死狀恐怖灭翔,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情辣苏,我是刑警寧澤肝箱,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布哄褒,位于F島的核電站,受9級特大地震影響煌张,放射性物質發(fā)生泄漏呐赡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一骏融、第九天 我趴在偏房一處隱蔽的房頂上張望链嘀。 院中可真熱鬧,春花似錦绎谦、人聲如沸管闷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽包个。三九已至,卻和暖如春冤留,著一層夾襖步出監(jiān)牢的瞬間碧囊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工纤怒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留糯而,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓泊窘,卻偏偏與公主長得像熄驼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烘豹,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評論 25 707
  • 用兩張圖告訴你瓜贾,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評論 2 59
  • "我就站在布拉格廣場携悯,在許愿池投下了希望祭芦,那群白鴿背對著夕陽,那畫面太美我不敢看憔鬼,布拉格的廣場無人的走廊龟劲,我一個人...
    JessieD閱讀 609評論 0 0
  • -------------------------------------------- 直接看評論吧 -----...
    大水啊大水閱讀 1,271評論 1 0
  • 冬去春來,花骨朵開始探出頭 一點一點地張開花瓣 一點一點地有了顏色 雨滴成水轴或,不論落入何處 也不論它流向哪里 終歸...
    冷冬年閱讀 4,532評論 118 224