別再瞎搞了,處理Java異常的10個最佳實踐
線上代碼不要使用printStackTrace()
寫完代碼后請一定要檢查下,代碼中千萬不要有printStackTrace()。因為printStackTrace()只會在控制臺上輸出錯誤的堆棧信息,他只適合于用來代碼調(diào)試。
真正需要記錄異常,請使用日志記錄。
永遠不要在catch塊中吞掉異常
catch?(NoSuchMethodException?e)?{
?????return?null;
??}
永遠不要不處理異常,而是返回null,這樣異常就會被吞掉,無法獲取到任何失敗信息,會給日后的問題排查帶來巨大困難。
?
在需要的地方聲明特定的受檢異常
?public?void?foo()?throws?Exception?{?//錯誤做法
??}
public?void?foo()?throws?SpecificException1,?SpecificException2?{?
//正確做法
}
###?始終只捕獲那些可以處理的異常
catch?(NoSuchMethodException?e)?
{
????throw?e;?//這代碼一點用都沒有
}
?
盡量捕獲特定的子類,而不是直接捕獲Exception類
try?{
??????someMethod();
??}?
??catch?(Exception?e)?
??{
??????LOGGER.error("method?has?failed",?e);
??}
?
永遠不要捕獲Throwable類
?
始終在自定義異常中覆蓋原有的異常,這樣堆棧跟蹤就不會丟失
?catch?(NoSuchMethodException?e)?
??{
??throw?new?MyServiceException("Some?information:?"?+?e.getMessage());??//錯誤做法
??}
catch?(NoSuchMethodException?e)?{
?????throw?new?MyServiceException("Some?information:?"?,?e);??//正確做法
}
?
可以記錄異常或拋出異常,但不要同時做
catch?(NoSuchMethodException?e)?{
?????LOGGER.error("Some?information",?e);
?????throw?e;
??}
?
永遠不要在finally中拋出異常
try?{
??someMethod();??//拋出?exceptionOne
}
?finally
{
??cleanUp();????//如果在這里再拋出一個異常,那么try中的exceptionOne將會丟失forever
}
?
如果您不打算處理異常,請使用finally塊而不是catch塊
try?{
??someMethod();?
}?
finally
{
??cleanUp();????
}
往期推薦

為什么阿里巴巴禁止使用BigDecimal的equals方法做等值比較?

前幾天內(nèi)推的讀者,已經(jīng)入職阿里了。

放棄Maven以后,我用了它。。。
直面Java第329期:哪個命令可以監(jiān)控虛擬機各種運行狀態(tài)信息?
深入并發(fā)第013期:拓展synchronized——鎖優(yōu)化
評論
圖片
表情
