我已经写了一个错误句柄如下所示。
Type#1
try{
// Logic
} catch (SpecificException e){
// Handle error-1
} catch (Exception e){
if(e.getCause() instanceof SpecificException){
// Handle error-1
}
// Handle error-2
}但是,为了获得更好的清晰度和性能,我想改进代码如下所示
Type#2
try{
// Logic
} catch (Exception e){
if(e instanceof SpecificException || e.getCause() instanceof SpecificException){
// Handle error-1
}
// Handle error-2
}基于JVM方面,哪种类型更好?
在本例中,我需要处理泛型异常类型和特定异常类型,因此出现了处理问题。
发布于 2017-04-06 08:16:27
从性能的角度来看,不会有什么不同。
在Java中,catch块的顺序很重要,您可以捕获声明异常的子类。这意味着JVM不能真正使用任何映射或索引,必须在异常表中进行查找,因此逻辑类似于一系列if (e instanceof XXX)--这基本上是您的第二种方法。
可读性方面是基于意见的,所以我不会对此发表评论。
JavaWorld有一篇文章,它解释了在字节码/ JVM级别捕获过程中发生的事情。
发布于 2017-04-06 07:58:35
您的第一个和第二个选项不一样,因为即使对于//Handle error-2,也会调用instanceof SpecificException逻辑,或者您可能需要添加一个其他块来处理这个问题,如下所示:
try{
// Logic
} catch (Exception e){
if(e instanceof SpecificException || e.getCause() instanceof SpecificException){
// Handle error-1
} else {//else block for other exceptions?
// Handle error-2
}
}正如您提到的,无论如何,如果您必须处理Exception (但是,一般来说,处理一般的Exception类型并不是很好的实践),那么第二个选项比在多个地方调用// Handle error-1和//Handle error-2更好和更易读。
发布于 2017-04-06 07:59:07
为了避免重复Handle error-1代码块(即使它只是一行),我可能会选择选项2。
如果您经常使用此模式,我可能还会考虑尝试将其包装在实用程序方法中,类似于Guava的Throwables类中给出的方法(我不确定它是否已经包含了可以解决您的情况的内容)。
https://stackoverflow.com/questions/43248895
复制相似问题