Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理异常';原因不同_Java_Exception - Fatal编程技术网

Java 处理异常';原因不同

Java 处理异常';原因不同,java,exception,Java,Exception,在我的一个软件中,我使用了一个基本上是协议实现的库。该库是根据前五个OSI层(物理到会话)构建的 我必须使用这个接口的会话层 public interface ReadSession { Iterable<byte[]> read(boolean fromStart, byte dataset, int nbData) throws SessionException; } 我觉得自己对固定次数的调用getCause()感到不舒服,因为: 在涉及的大量空检查中 我依赖于库(

在我的一个软件中,我使用了一个基本上是协议实现的库。该库是根据前五个OSI层(物理到会话)构建的

我必须使用这个接口的会话层

public interface ReadSession {
    Iterable<byte[]> read(boolean fromStart, byte dataset, int nbData) throws SessionException;
}
我觉得自己对固定次数的调用
getCause()
感到不舒服,因为:

  • 在涉及的大量空检查中
  • 我依赖于库()的实现细节,如果这些在将来发生变化,我就完蛋了

是否有人已经面临过这种情况,并想分享他关于如何尽可能干净地处理它的知识?

这里的一种方法是在您的单一捕获块中创建一个原因列表

例如

catch (SessionException t)
{
    List<String> causeList = new ArrayList<>();
    do
    {
        causeList.add(t.getClass().getName());
        t = t.getCause();

    } while(t != null);
}
然后,在catch块中构建
causeList
后,可以执行以下操作:

if (causeList.equals(ABORT_LIST))
{
    System.out.println("Aborting...");
}
catch(SessionException e) {
    Throwable cause = e.getCause();
    while(cause != null) {
        if(cause instanceof NetworkException.class) {
            //Trigger some logic
        }
        else if(...)
        cause = cause.getCause();
    }
}

最后我用了这样的东西:

if (causeList.equals(ABORT_LIST))
{
    System.out.println("Aborting...");
}
catch(SessionException e) {
    Throwable cause = e.getCause();
    while(cause != null) {
        if(cause instanceof NetworkException.class) {
            //Trigger some logic
        }
        else if(...)
        cause = cause.getCause();
    }
}

如果不调用
getCause()
,你怎么知道原因呢?@Berger我知道如果不调用
getCause()
,我永远无法知道原因。但是我想避免硬编码
getCause()
的链。也许有一些循环?不要依赖于库的实现细节,没有其他方法可以干净地完成它吗?@michael_bitard Yep,就是这样。我不想依赖于实现的细节,我来这里是想知道是否有一种干净的方法来处理这种情况…:-)@斑点;)我真正的意思是:没有其他更高层次的方法来做你想做的事情吗?问题是我猜不出整个原因列表。关键是,在对我来说很重要的原因(
IOException
NetworkException
GatewayException
)下面是一系列我无法预测的其他原因。然后,不是对这两个列表进行直接的等额比较,实现startsWith方法,该方法查看这两个列表,如果因果列表使用预定义列表启动,则返回true;否则就错了。的确如此,但即使如此,我还是决定坚持使用另一种我觉得不那么冗长的解决方案(见我的答案)。