美文网首页
异常链常用方式

异常链常用方式

作者: dream新世界 | 来源:发表于2018-10-23 18:11 被阅读0次

    1、异常链中initCause(e)的作用是什么啊?

    不是为了实现哪一句代码的。initCause()这个方法就是对异常来进行包装的,目的就是为了出了问题的时候能够追根究底。因为一个项目,越往底层,可能抛出的异常类型会用很多,如果你在上层想要处理这些异常,你就需要挨个的写很多catch语句块来捕捉异常,这样是很麻烦的。

    如果我们对底层抛出的异常捕获后,抛出一个新的统一的异常,会避免这个问题。但是直接抛出一个新的异常,会让最原始的异常信息丢失,这样不利于排查问题。举个例子,在底层会出现一个A异常,然后在中间代码层捕获A异常,对上层抛出一个B异常。如果在中间代码层不对A进行包装,在上层代码捕捉到B异常后就不知道为什么会导致B异常的发生,但是包装以后我们就可以用getCause()方法获得原始的A异常。这对追查BUG是很有利的。

    class A{
        try{
            ...
        }catch(AException a){
         throw new BException();
        }
    }
    ...
    class B{
        try{
            //调用类a的相关操作
            ...
        }catch(BException b){
            //这时候你需要去看b异常式什么问题导致的,你在A类里面
            //没有对AException进行包装,所以你无法知道是A导致的B
        }
    }
    

    如果包装以后:

    class A{
        try{
            ...
        }catch(AException a){
            BException b = new BEexception();
            b.initCause(a);
            throw b;
        }
    }
    ...
    class B{
        try{
            ...
        }catch(BException b){
            //什么导致了b呢?
            b.getCause();//得到导致B异常的原始异常
        }
    }
    

    简单理解,initCause(e)可以将异常带到另一个异常,通过getCause()可以得到异常的相关信息,而不会造成信息的遗失。

    try{
        ...
    }catch(Exception e){
        RuntimeException  newE = new RuntimeException("这是一个新的异常!");
        newE.initCause(e);
        throw newE;
    }
    

    打印结果:

    ...这是一个新的异常!
    
    cause by :e....
    

    initCause()不会覆盖掉原有异常的信息,它初始化的是newE异常的造成原因。

    相关文章

      网友评论

          本文标题:异常链常用方式

          本文链接:https://www.haomeiwen.com/subject/msgazftx.html