開心一笑
【想來(lái)想去掂咒,還是努力掙錢更靠譜,不然心情不好時(shí)缘挑,只能買兩瓶啤酒醫(yī)一袋雞爪在路邊嗷嗷的哭集歇,努力掙錢的話,就能躺在幽美的山中溫泉里敷面膜止住眼淚语淘。努力掙錢我還可以去紐約哭鬼悠,去倫敦哭,去巴黎哭亏娜,去羅馬哭,邊瀟灑邊哭蹬挺,想怎么哭就怎么哭】
提出問(wèn)題
如何優(yōu)雅的寫異常???
解決問(wèn)題
禁止捕獲非受檢異常
至于什么是受檢異常和非受檢異常维贺,我們不做討論。這里只具體說(shuō)明受檢和非受檢的具體事例
1)非受檢的:NullPointerException,ClassCastException,ArrayIndexsOutOfBoundsException,
ArithmeticException(算術(shù)異常巴帮,除0溢出)
2)受檢:Exception,FileNotFoundException,IOException,SQLException.
例:
@Test
public void test(){
try{
}catch(ArrayOutOfBoundsException e){
}catch(NullPointerException e){
}
}
非受檢異常一般是由于程序員代碼邏輯或者其他所導(dǎo)致的溯泣,如:NullPointerException虐秋。責(zé)任方在程序員,程序員應(yīng)該去解決它垃沦,而不是交給Java編譯器去處理客给。所以上面例子中, ArrayOutOfBoundsException 和 NullPointerException 異常都是非受檢異常肢簿,不應(yīng)該捕獲靶剑。同時(shí),也不應(yīng)該在正常代碼中處理這種異常 池充。
對(duì)異常進(jìn)行分類處理
處理異常時(shí)桩引,開發(fā)人員經(jīng)常會(huì)通過(guò)捕獲Exception異常來(lái)解決代碼中拋出的所有異常。雖然無(wú)傷大雅收夸,但卻是不可取的坑匠,不利于判斷導(dǎo)致異常的原因。
try{
.....
//錯(cuò)誤做法:直接用Exception攬括所有異常
}catch (Exception e){
e.printStackTrace();
}
正確做法:
try{
.....
}catch (FileNotFoundException e){
logger.warn("文件找不到錯(cuò)誤卧惜,請(qǐng)排查");
e.printStackTrace();
}catch (FileAlreadyExistsException e){
logger.warn("文件已存在錯(cuò)誤厘灼,請(qǐng)排查");
e.printStackTrace();
}
我們通過(guò)對(duì)異常進(jìn)行分類處理。當(dāng)異常發(fā)生時(shí)咽瓷,通過(guò)logger打日志设凹,就可以很清楚是文件找不到異常或者文件不存在異常忱详。
避免空的catch塊帶來(lái)的危險(xiǎn)
在捕獲異常后围来,如果在catch塊中,不做任何處理匈睁,是非常危險(xiǎn)的监透。程序出現(xiàn)問(wèn)題,我們又不做任何處理航唆,控制臺(tái)又不打印任何信息胀蛮,故意找虐的節(jié)奏。如:
try{
...
}catch(SomeException e){
//捕獲異常糯钙,卻不做任何處理
}
封裝異常讓其更受用
閱讀異常有兩類人:開發(fā)人員和用戶粪狼。對(duì)于開發(fā)人員,查找問(wèn)題時(shí)需要查看堆棧信息任岸,而對(duì)于用戶再榄,更多的是了解具體的業(yè)務(wù)問(wèn)題。如果你把堆棧里的異常信息傳到前端展示給用戶看享潜,用戶肯定會(huì)蒙圈困鸥。解決辦法就是封裝異常
例:
public class AyTest {
@Test
public void test(File file){
if(file.length() > 50000){
throw new AyBussinessException("上傳文件過(guò)大,請(qǐng)重新上傳");
}
}
}
class AyBussinessException extends RuntimeException{
AyBussinessException(){}
AyBussinessException(String msg){
super(msg);
}
}
通過(guò)自己封裝業(yè)務(wù)異常類 AyBussinessException 剑按,方便用戶清楚異常信息疾就,同時(shí)開發(fā)人員在以后的業(yè)務(wù)異常中都可以拋出 AyBussinessException 澜术,統(tǒng)一代碼,容易理解猬腰。上面只是一個(gè)簡(jiǎn)單的異常類封裝鸟废,更加復(fù)雜和通用的異常類封裝,有興趣的可以自己去實(shí)現(xiàn)姑荷。
推薦異常和日志的配合使用
開發(fā)除了可以將異常打印到控制臺(tái)中方便查看盒延。但是一旦軟件部署到生產(chǎn)環(huán)節(jié)中,就沒(méi)有所謂的控制臺(tái)厢拭,一旦生產(chǎn)環(huán)節(jié)出現(xiàn)相應(yīng)的問(wèn)題兰英,就無(wú)從排查。因此供鸠,建議在catch中畦贸,多打印日志。如下:
try{
.....
}catch (FileNotFoundException e){
//紀(jì)錄到日志文件中
logger.warn("文件找不到錯(cuò)誤楞捂,請(qǐng)排查");
e.printStackTrace();
}catch (FileAlreadyExistsException e){
logger.warn("文件已存在錯(cuò)誤薄坏,請(qǐng)排查");
throw new AyBussinessException("文件已存在錯(cuò)誤,請(qǐng)排查");
}
這樣寨闹,系統(tǒng)就會(huì)將錯(cuò)誤信息記錄到相關(guān)的日志文件中胶坠,方便以后排查。
切勿把異常放置在循環(huán)體內(nèi)
try-catch語(yǔ)句本身性能不高繁堡,如果再放到循環(huán)體中沈善,無(wú)非是雪上加霜。因此在開發(fā)中椭蹄,我們要極力避免闻牡。
例:
for(int i=0;i<10;i++){
try{
}catch (Exception e){
}
}
正確做法:
try{
for(int i=0;i<10;i++){
}
}catch (Exception e){
}
綜上所述:不要再循環(huán)體內(nèi)執(zhí)行復(fù)制,耗時(shí)的操作绳矩。
讀書感悟
來(lái)自《菊與刀》
- 一個(gè)人要是有所畏懼罩润,那么他就不是神,也不是不可觸碰的存在了翼馆。
- 雖然每個(gè)靈魂原本都閃耀著美德的光輝割以,如同一把新刀,但是应媚,如果不勤于磨礪严沥,它就會(huì)失去光澤。如他們所說(shuō)的"自身的銹跡"中姜,它和刀上的銹跡一樣有害消玄,因此人們必須像磨礪刀劍一樣對(duì)待自己的品行。光輝的靈魂一旦被銹跡掩飾,所有需要做的就是再磨礪一次莱找。
- 人們只有自己具有堅(jiān)定不移的信仰,才會(huì)有不尋常的寬容嗜桌。
經(jīng)典故事
【一個(gè)小女孩趴在窗臺(tái)上奥溺,看窗外的人正埋葬她心愛的小狗,不禁淚流滿面骨宠,悲慟不已浮定。她的外祖父見狀,連忙引她到另一個(gè)窗口层亿,讓她欣賞他的玫瑰花園桦卒。果然小女孩的心情頓時(shí)明朗。老人托起外孫女的下巴說(shuō):“孩子匿又,你開錯(cuò)了窗戶方灾。”哲理:打開失敗旁邊的窗戶碌更,也許你就看到了希望裕偿。】
大神文章
[1] Robert C.Martin. Clean Code: A Handbook of Agile Software [M]. Prentice Hall PTR,2008:50-69
[2] 秦小波. 編寫高質(zhì)量代碼:改善Java程序的151個(gè)建議[M]. 北京:機(jī)械工業(yè)出版社痛单,2012:300-301
[3] 李剛.瘋狂Java講義(第2版):電子工業(yè)出版社嘿棘,2014:2
[4] 趙景暉.Java 程序設(shè)計(jì)[M]:北京機(jī)械工業(yè)出版社,2005:1-2
[5] 明日科技.Java從入門到精通(第3版)[M]:清華大學(xué)出版社旭绒,2014
[6] 李晉.Java的昨天鸟妙,今天和明天[J].信息與電腦,2011(1).
[7] 任哲.JAVA技術(shù)應(yīng)用基礎(chǔ)[M]:機(jī)械工業(yè)出版社,2009:4-6
[8] 董云錚挥吵,陳千重父,梅惠平.Java技術(shù)應(yīng)用[M]:清華大學(xué)出版社,2007:2
[9] 周志明.深入理解Java虛擬機(jī)[M]:機(jī)械工業(yè)出版社蔫劣,2011:6
[10] 李明坪郭,陳京民,陶飛飛.Java程序設(shè)計(jì)與應(yīng)用[M] :清華大學(xué)出版社脉幢,2010:3-4
[11] 鄭悅.2006:開源精彩一年[J].中國(guó)計(jì)算機(jī)用戶,2006(50).
其他
如果有帶給你一絲絲小快樂(lè)歪沃,就讓快樂(lè)繼續(xù)傳遞下去,歡迎點(diǎn)贊嫌松、頂沪曙、歡迎留下寶貴的意見、多謝支持萎羔!