在Java中如何使用好Exception是門藝術(shù)。
一般我們常見的有checked異常(Exception)和unchecked異常(RuntimeException),區(qū)別在于前者在語法層面強制開發(fā)者對異常進行處理,后者則不用。
兩種異常的好壞或和使用方式大多還是根據(jù)場景而定。
一個現(xiàn)狀
目前接手了一個項目,此項目定位為基礎(chǔ)組件,對外部系統(tǒng)提供REST API服務(wù)和對應(yīng)SDK。
其中SDK的大致邏輯為:
//調(diào)用rest api
public Result submit(Object args){
Result result;
Request req = createRequest(args); //構(gòu)造rest請求
try{
result = doRestRequest(req); //請求http
}
catch(Exception e){
result = new Result();
result.code = -1; //發(fā)生異常時設(shè)置結(jié)果碼為失敗
}
return result;
}
邏輯上沒有問題,調(diào)用失敗的場景通過Result.code告訴給使用者。
從現(xiàn)在分布式微服務(wù)應(yīng)用角度看,遠程調(diào)用發(fā)生錯誤應(yīng)該要被認為是一種常態(tài),開發(fā)者必須關(guān)心發(fā)生錯誤的場景。
這樣的SDK封裝往往會讓使用方就會忽略錯誤的場景,直接提交本地事務(wù)完成請求,最終造成業(yè)務(wù)方與基礎(chǔ)組件中的數(shù)據(jù)狀態(tài)不一致。
改進
這種問題發(fā)生太多次了,每次都得事后手動處理。所以在下個版本的SDK中,打算使用Exception進行改造。
//調(diào)用rest api
public Result submit(Object args) throws Exception{
Request req = createRequest(args); //構(gòu)造rest請求
try{
return doRestRequest(req); //請求http
}
catch(Exception e){
throw new Exception(e); //此處可以對異常做一個封裝
}
}
這樣至少在代碼層面上提示使用方必須處理錯誤的場景,進行數(shù)據(jù)回滾和在界面上進行提示。
最后編輯于 :2017.12.10 04:04:36
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。