Java 处理异常';原因不同
在我的一个软件中,我使用了一个基本上是协议实现的库。该库是根据前五个OSI层(物理到会话)构建的 我必须使用这个接口的会话层Java 处理异常';原因不同,java,exception,Java,Exception,在我的一个软件中,我使用了一个基本上是协议实现的库。该库是根据前五个OSI层(物理到会话)构建的 我必须使用这个接口的会话层 public interface ReadSession { Iterable<byte[]> read(boolean fromStart, byte dataset, int nbData) throws SessionException; } 我觉得自己对固定次数的调用getCause()感到不舒服,因为: 在涉及的大量空检查中 我依赖于库(
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;否则就错了。的确如此,但即使如此,我还是决定坚持使用另一种我觉得不那么冗长的解决方案(见我的答案)。