打印异常的堆栈跟踪本身并不构成不好的做法,但仅在发生异常时打印 stace 跟踪可能是这里的问题 - 通常,仅打印堆栈跟踪是不够的。
catch
此外,如果块中执行的所有操作都是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();
}
(上面是 Eclipse 实际try-catch
自动生成的,用于处理InterruptedException
抛出的Thread.sleep
.)
对于大多数应用程序,仅将堆栈跟踪打印到标准错误可能是不够的。在许多情况下,不正确的异常处理可能会导致应用程序在意外状态下运行,并可能导致意外和未定义的行为。