Java catch(异常e)后跟if(异常e实例)
今天我偶然发现了这段代码Java catch(异常e)后跟if(异常e实例),java,exception,Java,Exception,今天我偶然发现了这段代码 try { ... } catch (Exception e) { if (e instanceof Exception) { ... } else { ... } } if-else分支有意义吗?捕获的异常e是否始终是异常的一个实例?是e始终是异常的一个实例。因此,您发布的代码没有多大意义 即使您希望处理不同的异常,也希望执行以下操作之一(示例): 如果希望以与Java 7相同的方式处理某些异常,可以执行以下操作: c
try {
...
} catch (Exception e) {
if (e instanceof Exception) {
...
} else {
...
}
}
if-else分支有意义吗?捕获的
异常e
是否始终是异常的一个实例?是e
始终是异常的一个实例。因此,您发布的代码没有多大意义
即使您希望处理不同的异常,也希望执行以下操作之一(示例):
如果希望以与Java 7相同的方式处理某些异常,可以执行以下操作:
catch( IOException | MyUserException e) {
//same handling for both
}
在java 7之前,您可能遇到以下情况:“代码> catch(异常e)和代码>在catch块内部检查,但应该小心使用这些构造,如果您有更好的选项(即Java 7 +多catch),则应该考虑这些。
最后请注意,像catch(Exception e)
这样的catch-all表达式可能很有用,但也可能是错误的来源,特别是在处理能力较差的情况下。在大多数情况下,您希望以特定的方式处理预期的异常(例如IOExceptions),并让所有其他异常冒泡。当然,您的代码可能希望在某个点捕获所有未捕获的异常(例如,记录它们),这就是您将使用的catch(Exception e)
——但是您应该知道其含义以及在这些情况下的操作。上面的代码没有任何意义,因为e始终是一个对象(实例)异常类的实例。因此,更清楚地说,程序控件将永远不会进入else块,好像(e instanceof exception)将始终为真。不,这没有任何意义。也许在它成为“SomethingException”之前,他们后来删除了“SomethingException”。这没有意义,在这种情况下,e
将始终是异常的一个实例,我肯定会查看源代码管理中的历史,看看最初是什么。我希望像catch(Throwable e){…}
这样的东西,一个好的优化编译器可能会把其他部分扔掉。但是我们会发现,javac不是那种编译器。
catch( IOException | MyUserException e) {
//same handling for both
}