課程
/后端開發(fā)
/Java
/Java入門第三季
?initCause(e)方法的作用是什么
2017-09-05
源自:Java入門第三季 1-7
正在回答
initCause()這個(gè)方法就是對(duì)異常來進(jìn)行包裝的,目的就是為了出了問題的時(shí)候能夠追根究底。因?yàn)橐粋€(gè)項(xiàng)目,越往底層,可能拋出的異常類型會(huì)用很多,如果你在上層想要處理這些異常,你就需要挨個(gè)的寫很多catch語句塊來捕捉異常,這樣是很麻煩的。如果我們對(duì)底層拋出的異常捕獲后,拋出一個(gè)新的統(tǒng)一的異常,會(huì)避免這個(gè)問題。但是直接拋出一個(gè)新的異常,會(huì)讓最原始的異常信息丟失,這樣不利于排查問題。舉個(gè)例子,在底層會(huì)出現(xiàn)一個(gè)A異常,然后在中間代碼層捕獲A異常,對(duì)上層拋出一個(gè)B異常。如果在中間代碼層不對(duì)A進(jìn)行包裝,在上層代碼捕捉到B異常后就不知道為什么會(huì)導(dǎo)致B異常的發(fā)生,但是包裝以后我們就可以用getCause()方法獲得原始的A異常。這對(duì)追查BUG是很有利的。
鄧一格 提問者
這是對(duì)異常的一種包裝。因?yàn)樵赾atch語句塊中throw一個(gè)新的異常時(shí)會(huì)丟失底層產(chǎn)生的異常的信息,所以直接在catch中拋出異常是不被提倡的。
try{
test1();
}catch(DrunkException?e){
????RuntimeException newExc=?new?RuntimeException();
? ? newExc.initCause(e);?
????throw?newExc;
}?
而包裝成一個(gè)新異常后,調(diào)用initCause()方法,再將其拋出給更上一層的調(diào)用者處理,它的作用你相當(dāng)于保存了原始的異常信息。其實(shí)這相當(dāng)于形成一個(gè)異常鏈,可以很清楚地顯示出原始的異常出處。否則可能會(huì)丟失原始的異常信息。
舉報(bào)
Java中你必須懂得常用技能,不容錯(cuò)過的精彩,快來加入吧
2 回答為什么突然出現(xiàn)一個(gè)initCause(e)
1 回答newExc.initCause(e); initCause是什么意思?用來干嘛的
5 回答作業(yè)中,initCause(e)的作用是什么???
5 回答initCause()是什么意思
1 回答為什么要調(diào)用initCause?
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2017-09-05
initCause()這個(gè)方法就是對(duì)異常來進(jìn)行包裝的,目的就是為了出了問題的時(shí)候能夠追根究底。因?yàn)橐粋€(gè)項(xiàng)目,越往底層,可能拋出的異常類型會(huì)用很多,如果你在上層想要處理這些異常,你就需要挨個(gè)的寫很多catch語句塊來捕捉異常,這樣是很麻煩的。如果我們對(duì)底層拋出的異常捕獲后,拋出一個(gè)新的統(tǒng)一的異常,會(huì)避免這個(gè)問題。但是直接拋出一個(gè)新的異常,會(huì)讓最原始的異常信息丟失,這樣不利于排查問題。舉個(gè)例子,在底層會(huì)出現(xiàn)一個(gè)A異常,然后在中間代碼層捕獲A異常,對(duì)上層拋出一個(gè)B異常。如果在中間代碼層不對(duì)A進(jìn)行包裝,在上層代碼捕捉到B異常后就不知道為什么會(huì)導(dǎo)致B異常的發(fā)生,但是包裝以后我們就可以用getCause()方法獲得原始的A異常。這對(duì)追查BUG是很有利的。
2017-09-05
這是對(duì)異常的一種包裝。因?yàn)樵赾atch語句塊中throw一個(gè)新的異常時(shí)會(huì)丟失底層產(chǎn)生的異常的信息,所以直接在catch中拋出異常是不被提倡的。
try{
test1();
}catch(DrunkException?e){
????RuntimeException newExc=?new?RuntimeException();
? ? newExc.initCause(e);?
????throw?newExc;
}?
而包裝成一個(gè)新異常后,調(diào)用initCause()方法,再將其拋出給更上一層的調(diào)用者處理,它的作用你相當(dāng)于保存了原始的異常信息。其實(shí)這相當(dāng)于形成一個(gè)異常鏈,可以很清楚地顯示出原始的異常出處。否則可能會(huì)丟失原始的異常信息。