異常處理
- catch匹配
try{
//可能觸發(fā)異常的代碼
}catch(NumberFormatException e){
System.out.println("not valid number");
}catch(RuntimeException e){
System.out.println("runtime exception "+e.getMessage());
}catch(Exception e){
e.printStackTrace();
}
catch可以有多條
異常處理機(jī)制將根據(jù)拋出的異常類型找第一個(gè)匹配的catch塊,找到后, 執(zhí)行catch塊內(nèi)的代碼,其他catch塊就不執(zhí)行了,如果沒(méi)有找到歧斟,會(huì)繼續(xù)到上層方法中查找。需要注意的是偏形,拋出的異常類型是catch中聲明異常的子類也算匹配静袖,所以需要將最具體的子類放在前面,如果基類Exception放在前面俊扭,則其他更具體的catch代碼將得不到執(zhí)行
- 重新throw
try{
//可能觸發(fā)異常的代碼
}catch(NumberFormatException e){
System.out.println("not valid number");
throw new AppException("輸入格式不正確", e);
}catch(Exception e){
e.printStackTrace();
throw e;
}
為什么要重新拋出呢队橙?
因?yàn)楫?dāng)前代碼不能夠完全處理該異常,需要調(diào)用者進(jìn)一步處理
為什么要拋出一個(gè)新的異常呢萨惑?
當(dāng)然是當(dāng)前異常不太合適捐康,不合適可能是信息不夠,需要補(bǔ)充一些新信息庸蔼,還可能是過(guò)于細(xì)節(jié)解总, 不便于調(diào)用者理解和使用,如果調(diào)用者對(duì)細(xì)節(jié)感興趣姐仅,還可以繼續(xù)通過(guò)getCause()獲取到原始異常花枫。
- finally
try{
//可能拋出異常
}catch(Exception e){
//捕獲異常
}finally{
//不管有無(wú)異常都執(zhí)行
}
catch不是必需的
不管有無(wú)異常發(fā)生刻盐,都會(huì)執(zhí)行
(1)如果沒(méi)有異常發(fā)生,在try內(nèi)的代碼執(zhí)行結(jié)束后執(zhí)行劳翰。
(2)如果有異常發(fā)生且被catch捕獲敦锌,在catch內(nèi)的代碼執(zhí)行結(jié)束后執(zhí)行
(3)如果有異常發(fā)生但沒(méi)被捕獲,則在異常被拋給上層之前執(zhí)行佳簸。
一般用于釋放資源乙墙,如數(shù)據(jù)庫(kù)連接、文件流等
- return
如果在try或者catch語(yǔ)句內(nèi)有return語(yǔ)句溺蕉,則return語(yǔ)句在finally語(yǔ)句執(zhí)行結(jié)束后才執(zhí)行,但finally并不能改變返回值
如果在finally中也有return語(yǔ)句呢悼做?try和catch內(nèi)的return會(huì)丟失疯特,實(shí)際會(huì)返回finally中的返回值。 finally中有return不僅會(huì)覆蓋try和catch內(nèi)的返回值肛走,還會(huì)掩蓋try和catch內(nèi)的異常漓雅,就像異常沒(méi)有發(fā)生一樣 - throws
用于聲明一個(gè)方法可能拋出的異常
語(yǔ)法
public void test() throws AppException, SQLException, NumberFormatException {
//....
}
對(duì)于RuntimeException(unchecked exception),是不要求使用throws進(jìn)行聲明的朽色,但對(duì)于checked exception邻吞,則必須進(jìn)行聲明,換句話說(shuō)葫男,如果沒(méi)有聲明抱冷,則不能拋出
- Checked對(duì)比Unchecked Exception
一種普遍的說(shuō)法是,RuntimeException(unchecked)表示編程的邏輯錯(cuò)誤梢褐, 編程時(shí)應(yīng)該檢查以避免這些錯(cuò)誤旺遮,比如說(shuō)像空指針異常,如果真的出現(xiàn)了這些異常盈咳,程序退出也是正常的耿眉,程序員應(yīng)該檢查程序代碼的bug而不是想辦法處理這種異常。Checked exception表示程序本身沒(méi)問(wèn)題鱼响,但由于I/O鸣剪、網(wǎng)絡(luò)、數(shù)據(jù)庫(kù)等其他不可預(yù)測(cè)的錯(cuò)誤導(dǎo)致的異常丈积,調(diào)用者應(yīng)該進(jìn)行適當(dāng)處理筐骇。
無(wú)論是checked還是unchecked異常,無(wú)論是否出現(xiàn)在throws聲明中江滨,我們都應(yīng)該在合適的地方以適當(dāng)?shù)姆绞竭M(jìn)行處理
其實(shí)觀點(diǎn)本身并不太重要拥褂,更重要的是項(xiàng)目中的一致性
如何使用異常
- 異常應(yīng)該且僅用于異常情況
- 異常處理的目標(biāo)
用戶
如果用戶輸入不對(duì),可能提示用戶具體哪里輸入不對(duì)牙寞,如果是編程錯(cuò)誤饺鹃,可能提示用戶系統(tǒng)錯(cuò)誤莫秆、建議聯(lián)系客服,如果是第三方連接問(wèn)題悔详,可能提示用戶稍后重試
程序員
他們一般不關(guān)心用戶輸入錯(cuò)誤镊屎,而關(guān)注編程錯(cuò)誤或第三方錯(cuò)誤,對(duì)于這些錯(cuò)誤茄螃,需要報(bào)告盡量完整的細(xì)節(jié)缝驳,包括異常鏈、異常棧等归苍,以便盡快定位和解決問(wèn)題用狱。
第三方
一般都是難以通過(guò)程序自動(dòng)解決的,第三方錯(cuò)誤則可能可以拼弃,甚至很多時(shí)候夏伊,程序都不應(yīng)該假定第三方是可靠的,應(yīng)該有容錯(cuò)機(jī)制吻氧。 比如說(shuō)溺忧,某個(gè)第三方服務(wù)連接不上(比如發(fā)短信),可能的容錯(cuò)機(jī)制是盯孙,換另一個(gè)提供同樣功能的第三方試試鲁森,還可能是,間隔一段時(shí)間進(jìn)行重試振惰,在多次失敗之后再報(bào)告錯(cuò)誤歌溉。 - 異常處理的一般邏輯
如果自己知道怎么處理異常,就進(jìn)行處理骑晶,如果可以通過(guò)程序自動(dòng)解決研底,就自動(dòng)解決,如果異惩赴眨可以被自己解決榜晦,就不需要再向上報(bào)告