【发布时间】:2019-05-02 11:10:26
【问题描述】:
像下面的选项 1 那样捕获特定异常非常常见,也被认为是捕获异常的保存方式,为什么选项 2 很少被考虑,因为 非常冗长(不确定是否要使用这个词! )它可以变成,这就是我目前所理解的。 我的问题是,是否还有其他情况应该考虑捕获选项 2(General Exception) 而不是选项 1 之类的异常?
Opt1 -> 特定例外:
try{
TextIO.putf(s);
FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
}catch (FileNotFoundException notfEx){
//Do something
}catch (NullPointerException nullEx){
//Do something
}catch(IllegalArgumentException illEx){
//Do something
}
Opt2 -> 一般例外:
try{
TextIO.putf(s);
FileOutputStream mFileOutputStream = new FileOutputStream("/content/doc/test.pdf", true);
}catch (Exception ex){
if(ex.getClass() == java.io.FileNotFoundException.class) {
//Do something
}else if(ex.getClass() == java.lang.IllegalArgumentException.class){
//Do something
}else if(ex.getClass() == java.lang.NullPointerException.class){
//Do something
}
}
}
【问题讨论】:
-
更快?不是问题。我更担心代码和意图的清晰度。像这样的纳米优化并不重要。
-
不相关,但比较
.getClass()不会包含子类。因此(例如)IllegalArgumentException的各种子类不会由您的Do something块处理。 -
如果第一个选项在 JDK 的大多数实现中不是 非常轻微 更快,我会惊讶(不是说它...只是我会感到惊讶)。 但是我也真的不会担心这个,除非你发现这是你代码中的一个严重的热点,如果是这样的话,要么不使用
Exceptions,要么压制他们与在此处选择正确的分支结构相比,创建堆栈跟踪可能会提供更大的性能提升。 -
就两种不相关的语言提出一个问题是让您的问题因过于宽泛而被投票结束的途径。您需要提出具体而切题的问题。
-
简单地分析两个实现并比较结果。