我有一个单线程应用程序,如果出现问题应该将DOS错误级别设置为非零值。 是抛出RuntimeException还是使用System.exit(nonzero)更好? 我不需要堆栈跟踪,并且我不希望这个应用程序被扩展/重复使用。 这两个选项之间有什么区别?
我有一个单线程应用程序,如果出现问题应该将DOS错误级别设置为非零值。 是抛出RuntimeException还是使用System.exit(nonzero)更好? 我不需要堆栈跟踪,并且我不希望这个应用程序被扩展/重复使用。 这两个选项之间有什么区别?
System.exit(int)
就是为此而存在的。使用它吧。System.exit
更好。System.exit
。System.exit
,请考虑错误条件是否可能由调用您方法的某些Java代码处理。如果错误直接发生在main
方法中,则可能永远不会有调用者来处理该异常,因此您应该调用System.exit
。否则,通常最好抛出异常 - 但不是RuntimeException
,您应该使用适当表示遇到的错误的异常类型。如有必要,请编写自己的RuntimeException
子类。System.exit
来处理。这样做可以灵活地处理异常条件,同时仍然满足您以错误代码终止的需求。特别是,它可以让您控制返回代码和任何其他输出,您可能为用户生成(错误消息、堆栈跟踪等)。如果您在主函数中抛出异常(或让异常逃逸),则会失去该控制。System.exit
。static public void main() {
try {
runMyApp();
} catch (Exception e) {
System.exit(1);
}
}
抛出的异常将打印出堆栈跟踪,如果您不需要它,请使用System.exit。
在退出时,您可以通过System.out向用户发送信息(我假设该应用程序仅在命令行环境中运行)。
您应该考虑捕获所有错误并将错误记录在单独的日志中,这样可以确保当您关闭终端时堆栈跟踪不会永久丢失。为此,请查看log4j,它非常易于使用。
APP本身应该使用System.exit。这是它与调用环境(脚本)的接口。任何内部组件当然都应该使用Exception。当你把它们放在一起时,它们可以同时存在:
Application.main(...) {
parse(args);
check(...);
try {
MyObject o = ...;
o.doMyStuff();
} catch (Exception e) {
System.err.println("Oops, something went wrong!"); // by example, or use a logging framework! // anyway in a shell app System.in/out/err IS my interface with the outworld
System.exit(ERROR_CODE);
}
System.out.println("Worked!");
}
这取决于你想向启动程序的脚本报告多少信息。如果脚本旨在执行一系列操作,这可能非常重要。https://shapeshed.com/unix-exit-codes/
示例:我开发了一个Java程序,调用外部API,下载响应并将其保存到文件中。 可能的结果:
现在我的脚本知道出了什么问题,它可以根据结果采取不同的操作。
底线:像任何良好的API一样,清楚地定义您的输入和输出参数,并使用System.exit
。
System.exit(num)不是一个好的选择,因为它会关闭JVM,而且即使在catch块之后有finally块,它也不会运行。
抛出RuntimeException也可能不是最好的选择,可以像之前提到的那样子类化,这是一个特定于应用程序的异常,我认为这可能是更好的选择。 -Manish
不推荐使用System.exit()。它会关闭JVM。