可以使用Exception.getCause()来了解链式异常吗?

时间:2014-03-05 14:46:43

标签: java exception sqlexception chaining instanceof

我的代码如下:

    SQLException sqlExc;
    //resX is obtained from the method signature and it's a ResourceException
    Exception linkedExc = resX.getLinkedException();
    // if linkedExc exception is a SQL Exception, assign it to sqlExc
    if (linkedExc instanceof SQLException) {
        sqlExc = (SQLException) linkedExc;
    }

会改变

Exception linkedX = resX.getLinkedException();

Exception linkedX = new Exception(resX.getCause());

给出相同的结果?或者Exception的类型不会保留在新创建的例外中?

如果不是最好的方法是什么?

这是一个15年的代码,这就是它使用弃用方法的原因。我正在努力解决这个问题。

1 个答案:

答案 0 :(得分:1)

答案是肯定的。以下代码证明了这一点。您可以在此处或在编写时使用它。两者都应该通过if声明。

import java.sql.SQLException;
import javax.resource.ResourceException;   

public class Linking {

    public static void main(String[] args) {

        SQLException resW = new SQLException("blubb");
        ResourceException resX = new ResourceException("a message", resW);
        SQLException sqlExc = null;
        Throwable linkedExc = resX.getCause();

        // if linkedExc exception is a SQL Exception, assign it to sqlExc
        if (linkedExc instanceof SQLException) {
            sqlExc = (SQLException) linkedExc;
        }           
        if (sqlExc != null)
            sqlExc.printStackTrace();
    }    
}

有关ResourceException(http://docs.oracle.com/javaee/1.4/api/javax/resource/ResourceException.html#setLinkedException%28java.lang.Exception%29)的文档说:

  

已过时。 J2SE 1.4版支持链式异常工具   允许任何throwable知道另一个throwable,如果有的话,   这导致它被抛出。请参阅 getCause 和initCause方法   java.lang.Throwable类。