打印异常本身的堆栈跟踪并不构成坏习惯,但是仅在异常发生时打印stace跟踪可能是这里的问题-通常,仅打印堆栈跟踪是不够的。
此外,如果在一个catch
块中执行的所有操作都是a,则有一种可能会怀疑未执行适当的异常处理e.printStackTrace
。处理不当可能最多意味着一个问题将被忽略,而最糟糕的是该程序会继续以未定义或意外的状态执行。
例
让我们考虑以下示例:
try {
initializeState();
} catch (TheSkyIsFallingEndOfTheWorldException e) {
e.printStackTrace();
}
continueProcessingAssumingThatTheStateIsCorrect();
在这里,我们要进行一些初始化处理,然后再继续进行一些需要进行初始化的处理。
在上面的代码中,应该已经捕获了异常并对其进行了适当的处理,以防止程序继续使用continueProcessingAssumingThatTheStateIsCorrect
可能会导致问题的方法。
在许多情况下,e.printStackTrace()
这表明某些异常正在被吞噬,并且允许进行处理,就好像每个问题都没有发生一样。
为什么这会成为问题?
糟糕的异常处理变得更加普遍的最大原因之一可能是由于Eclipse之类的IDE如何自动生成e.printStackTrace
对异常处理执行代码的代码:
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
(以上是try-catch
Eclipse自动生成的实际值,用于处理InterruptedException
抛出的异常Thread.sleep
。)
对于大多数应用程序,仅将堆栈跟踪信息打印为标准错误可能还不够。在许多情况下,异常处理不当可能导致应用程序在意外状态下运行,并可能导致意外和未定义的行为。