大家好猿规,我是IT修真院深圳分院第6期學(xué)員,一枚正直善良的JAVA程序員宙橱。
今天給大家分享一下姨俩,修真院官網(wǎng)任務(wù)中用到的知識(shí)點(diǎn),異常處理师郑。
1.背景介紹
在理想境界中环葵,程序永遠(yuǎn)不會(huì)出現(xiàn)問題,用戶輸入的數(shù)據(jù)永遠(yuǎn)是正確的宝冕,邏輯沒有任何問題 张遭,選擇打開的文件也一定是存在的,內(nèi)存永遠(yuǎn)是夠用的……反正沒有任何問題地梨!但是一旦出現(xiàn)這些問題菊卷,如果處理不好,程序就不能正常運(yùn)行了宝剖,用戶就有可能再也不使用這個(gè)程序了洁闰。
2.知識(shí)剖析
對比一下我們就會(huì)發(fā)現(xiàn),RuntimeException 是在程序中可以完全避免的万细,比如數(shù)組越界異常扑眉,只要我們在程序里作個(gè)判斷,如果要訪問的數(shù)組元素下標(biāo)和數(shù)組的長度作一下比較就知道會(huì)不會(huì)越界,再比如空指針異常襟雷,如果在訪問對象時(shí)判斷一下對象的變量是否為空就可以了。
而非RuntimeException 則是程序無法避免的仁烹,比如IO異常耸弄,你的程序正在讀一個(gè)文件,而這個(gè)文件所在磁盤出現(xiàn)了壞道卓缰,這就必然會(huì)引發(fā)IOException计呈,這是不是靠編程高手編寫完美的程序就可以法避免得了的,程序所能做的只有出現(xiàn)異常之后怎么處理的問題征唬。
異常處理程序可以做的不僅僅是打印錯(cuò)誤消息或停止程序捌显。 它們可以執(zhí)行錯(cuò)誤恢復(fù),提示用戶做出決定总寒,或者使用異常鏈將錯(cuò)誤傳播到更高級別的處理程序
3.常見問題
1.什么時(shí)候拋出扶歪,什么時(shí)候捕獲?
2.在Controller里摄闸,大段的Try Catch 會(huì)有什么壞處善镰?
4.解決方案
1.什么時(shí)候拋出,什么時(shí)候捕獲年枕。炫欺?
Java異常處理原則之一:延遲捕獲
意思是,當(dāng)異常發(fā)生時(shí)熏兄,不應(yīng)立即捕獲品洛,而是應(yīng)該考慮當(dāng)前作用域是否有有能力處理這一異常的能力,如果沒有摩桶,則應(yīng)將該異常繼續(xù)向上拋出桥状,交由更上層的作用域來處理。
一個(gè)例子:
某方法String readFile(String filename)典格,會(huì)去嘗試讀出指定文件的內(nèi)容并返回岛宦,其使用FileInputStream來讀取指定文件,而FileInputStream的構(gòu)造方法會(huì)拋出FileNotFoundException耍缴,這是一個(gè)Checked Exception砾肺。
那么readFile方法是應(yīng)該捕獲這個(gè)異常,還是拋出這個(gè)異常呢防嗡?
很顯然應(yīng)該拋出变汪。因?yàn)閞eadFile這個(gè)方法可能會(huì)在不同的場景下,被不同的代碼調(diào)用蚁趁,在這些場景中裙盾,出現(xiàn)“文件未找到”的情況時(shí)的處理邏輯可能是不同的,例如某場景下要發(fā)出告警信息,另一場景下可能會(huì)嘗試從另一個(gè)文件中讀取番官,第三個(gè)場景下可能需要將錯(cuò)誤信息提示給用戶庐完。在這種情況下,在readFile方法內(nèi)的作用域中徘熔,是處理不了這個(gè)異常的门躯,需要拋出,交由上層的酷师,具備了處理這個(gè)異常的能力的作用域來處理讶凉。
2.在Controller里,大段的Try Catch 會(huì)有什么壞處山孔?
1.try catch 的代價(jià)比較大懂讯。相對于判斷返回值,拋出異常到捕獲台颠,需要更多的cpu指令和代碼
2.Java的異常機(jī)制是由JVM控制的褐望,業(yè)務(wù)邏輯復(fù)雜的情況下,會(huì)影響controller的執(zhí)行效率
5.編碼實(shí)戰(zhàn)
6.擴(kuò)展思考
spring MVC 異常統(tǒng)一處理蓉媳?
7.參考文獻(xiàn)
1.知乎
2.https://blog.csdn.net/eson_15/article/details/51731567
8.更多討論
1.大段try/catch到底能不能寫譬挚?
A:如果try中的異常較統(tǒng)一且確定,可以統(tǒng)一處理酪呻,使代碼可讀性更好减宣。
2.在方法名后拋出異常和在方法體中排除異常有什么區(qū)別?
A:如果方法體內(nèi)拋出玩荠,方法名后也要拋出漆腌。
3.springmvc? ExceptionHandler是如何實(shí)現(xiàn)的?
A:原理不太懂阶冈,只能說controller中有對應(yīng)的Exception拋出闷尿,并且springmvc?ExceptionHandler有定義相應(yīng)類型的話就可以自動(dòng)捕獲。
感謝大家觀看
PPT:PPT
視頻:視頻
今天的分享就到這里啦女坑,歡迎大家點(diǎn)贊填具、轉(zhuǎn)發(fā)、留言匆骗、拍磚~
技能樹.IT修真院
“我們相信人人都可以成為一個(gè)工程師劳景,現(xiàn)在開始,找個(gè)師兄碉就,帶你入門盟广,掌控自己學(xué)習(xí)的節(jié)奏,學(xué)習(xí)的路上不再迷梦驮浚”筋量。
這里是技能樹.IT修真院烹吵,成千上萬的師兄在這里找到了自己的學(xué)習(xí)路線,學(xué)習(xí)透明化桨武,成長可見化肋拔,師兄1對1免費(fèi)指導(dǎo)⊙剿幔快來與我一起學(xué)習(xí)吧~
小禮物走一走只损,來簡書關(guān)注我
贊賞支持
作者:blue
鏈接:
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán)七咧,非商業(yè)轉(zhuǎn)載請注明出處。