在第一次看到异常时使应用程序崩溃是非常糟糕的做法。特别是当某些工作未保存并且应用程序正在使用一些需要在应用程序终止执行之前释放和清理的资源时。一些非常流行的软件曾经这样做......而不是“修复”问题,他们在应用程序重新启动时引入了数据恢复功能。然而,诀窍,这不是好的软件工程。
至少,您的应用程序不应该在遇到第一个异常/错误时崩溃,而是通过有意义的消息恢复。将所有内容都包装在一个RuntimeException
(甚至是Throwable
)中是很懒惰的,尤其是对它不做任何事情。
Java 不支持任何类型的标志,因为有 1) 一种解决方法,以及 2) 处理这种情况的更好方法。例如 :
1.处理调用方法中的异常
您可以throws
在方法声明中添加关键字,直到您的static public void main
方法,如果不处理异常,最终将使用堆栈跟踪使应用程序崩溃。
class Foo {
public void someMethod(....) throws IllegalArgumentException, IOException {
...
}
static public void main(String...args) throws Throwable {
new Foo().someMethod();
}
}
此方法不提供任何可恢复性方法,并且可能会让您的用户不满意(如果他们从控制台运行应用程序,则会出现大量无意义的 stachtrace,或者如果他们从快捷方式或 GUI 启动应用程序,则根本什么都没有)。另外,如果你有一些获取的资源,当异常发生时你将无法清理它们。至少,在抛出上面的异常之前,你main
应该输出一些东西。catch (Throwable e)
就像是 :
class Foo {
public void someMethod(....) throws IllegalArgumentException, IOException {
...
}
static public void main(String...args) {
try {
new Foo().someMethod();
} catch (...) {
// output or log exception here and, optionally, cleanup and exit
}
}
}
**编辑**
考虑这种情况:一个程序正在初始化一些资源来处理一些数据,然后在处理过程中发生一些运行时异常(或错误),应用程序崩溃,但资源没有释放或释放。然而,在 Java 中,可以做到这一点
public E doSomething() throws RuntimeException {
// declare a bunch of resources
try {
// process resources with unchecked exceptions
} finally {
// free resources
}
// return some result
}
并在错误或成功时干净地退出该方法,甚至可能为“后代”记录运行时错误。
2.记录错误并返回一些有意义的值
记录是一种非常好的做法。您可以向您的用户显示一些消息,告诉他们在不使整个事情崩溃的情况下无法执行该操作,并为您提供一些用户在做什么和在哪里做的痕迹。一个简单的日志系统可以是:
class Foo {
static private final Logger LOG = Logger.getLogger(Foo.class.getName());
public boolean doSomethingImpl(...) {
boolean result = true;
try {
...
} catch (SomeException e) {
LOG.log(Level.SEVERE, "meaningful message why method could not do something!", e);
result = false;
}
return result;
}
public void doSomething() {
if (!doSomethingImpl(...)) {
// handle failure here
}
}
}
默认情况下,Logger
会将所有内容输出到err
输出流,但您可以添加自己的处理程序:
// loggers are singletons, so you can retrieve any logger at anytime from
// anywhere, as long as you know the logger's name
Logger logger = Logger.getLogger(Foo.class.getName());
logger.setUseParentHandlers(false); // disable output to err
logger.addHandler(new MyHandler()); // MyHandler extends java.util.logging.Handler
Java 已经附带了一些默认的日志处理程序,其中一个写入文件。
等等