淺談java異常鏈與異常丟失
1、在java的構(gòu)造方法中提供了 異常鏈.. 也就是我們可以通過構(gòu)造方法不斷的將 異常串聯(lián)成一個(gè)異常鏈...
之所以需要異常連,是因?yàn)樘幱诖a的可理解性,以及閱讀和程序的可維護(hù)性...
我們知道我們每拋出一個(gè)異常都需要進(jìn)行try catch ...那么豈不是代碼很臃腫...
我們?nèi)绻梢詫惓4?lián)成一個(gè)異常連,然后我們只捕獲我們的包裝 異常,我們知道 RuntimeException 以及其派生類可以不進(jìn)行try catch 而被jvm自動(dòng)捕獲并處理..
當(dāng)然了我們可以自己定義自己的異常類從RuntimeException中派生,然后通過一級(jí)一級(jí)的包裝,假如異常出現(xiàn)了JWM通過我們的自定義RuntimeException直接輸出 cause
(原因)也就是 我們的異常鏈..因此我們的所有異常也就輸出了,這樣就減少了很多的異常處理的代碼。。。
只有 Throwable ----> Exception RuntimeException Error提供了 構(gòu)造方法實(shí)現(xiàn)異常鏈的機(jī)制。。。其他異常需要通過initCause來
構(gòu)造異常連..
下面一段代碼就是異常連的一個(gè)簡單示例...可以打印整個(gè)程序過程中出現(xiàn)的異常。。
public class TestT { public static void a() throws Exception{ //拋出異常給上級(jí)處理 try { b() ; } catch (Exception e) { throw new Exception(e) ; } } public static void b() throws Exception{ //拋出異常給上級(jí)處理 try { c() ; } catch (Exception e) { throw new Exception(e); } } public static void c() throws Exception { //拋出異常給上級(jí)處理 try { throw new NullPointerException("c 異常鏈中的空指針異常..") ; } catch (NullPointerException e) { throw new Exception(e) ; } } public static void main(String[]args){ try { a() ; } catch (Exception e) { e.printStackTrace(); } } }
2、 try catch ...finally 有個(gè)漏洞就是異常缺失.. 例如三個(gè)try catch 嵌套在一起 ..內(nèi)部的2個(gè)try catch 就可以省略 catch ....直接 try finally ..
看下面代碼 我們發(fā)現(xiàn)丟失了2個(gè)異常信息
public class MyTest { public void open() throws Exception{ throw new Exception(){ public String toString() { return this.getClass().getName()+"CeryImmportException"; }; } ; } public void close() throws Exception{ throw new Exception(){ public String toString() { return this.getClass().getName()+"close Exception" ; }; } ; } public void three() throws Exception{ throw new Exception(){ public String toString() { return this.getClass().getName() + "three" ; }; } ; } public static void main(String[]agrs){ MyTest mt=new MyTest() ; try{ try{ try{ mt.open(); }finally { System.out.println("delete open"); mt.close() ; } } finally{ System.out.println("delete close"); mt.three() ; } }catch(Exception ex){ ex.printStackTrace(); } } }
以上這篇淺談java異常鏈與異常丟失就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
超詳細(xì)介紹idea中java程序打jar包的兩種方式
這篇文章主要介紹了超詳細(xì)介紹idea中java程序打jar包的兩種方式一種是可直接執(zhí)行的runnable jar文件,另一種是包含多個(gè)主類,運(yùn)行時(shí)需要指定主類全類名的jar包,感興趣的可以了解一下2020-07-07java?http請求設(shè)置代理Proxy的兩種常見方法
代理是一種常見的設(shè)計(jì)模式,其目的就是為其他對象提供一個(gè)代理以控制對某個(gè)對象的訪問,這篇文章主要給大家介紹了關(guān)于java?http請求設(shè)置代理Proxy的兩種常見方法,需要的朋友可以參考下2023-11-11SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑
本文主要介紹了SpringBoot中使用@scheduled定時(shí)執(zhí)行任務(wù)的坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼。詳細(xì)的介紹了Redis的安裝和在java中的操作,具有一定的參考價(jià)值,有興趣的可以了解一下2017-05-05