如果Java文件抛出异常,如何返回非零退出代码
我使用下面的脚本(.sh文件)在UNIX系统中运行java代码,但即使java在这两种情况下都出现异常或成功终止, 退出代码为0,我想从脚本返回非零的退出代码,如果Java运行抛出异常,那么我可以添加if-then签入脚本,以打印成功或失败消息如果Java文件抛出异常,如何返回非零退出代码,java,shell,sh,Java,Shell,Sh,我使用下面的脚本(.sh文件)在UNIX系统中运行java代码,但即使java在这两种情况下都出现异常或成功终止, 退出代码为0,我想从脚本返回非零的退出代码,如果Java运行抛出异常,那么我可以添加if-then签入脚本,以打印成功或失败消息 #!/bin/sh echo 'processing started -->>' LOC=/opt/appl/Mapping/ export JAVA_HOME=/usr/java6 export PATH=/usr/java6/bin
#!/bin/sh
echo 'processing started -->>'
LOC=/opt/appl/Mapping/
export JAVA_HOME=/usr/java6
export PATH=/usr/java6/bin
LD_LIBRARY_PATH=/opt/appl/JARS/
export LD_LIBRARY_PATH
java -classpath $LOC/ojdbc6-11.2.0.3.0.jar:$LOC/ds35-02.00.11.jar:$LOC/log4j-1.2.17.jar:$LOC/TestClasses.jar:$LOC/db2jcc_license_cisuz-3.0.0.jar:$LOC/db2jcc_license_cu-3.0.0.jar:$LOC/db2jcc-3.0.0.jar -Xms256M -Xmx512M com.home.backfill.TestRun
我可以在Java文件中使用Try catch,并在catch块中使用
System.exit(1)
,但我正在寻找任何好的通用方法,因为我的代码可能很长,不确定是否最好在每个catch块中都放System.exit(1)
。如果我理解正确,为什么不运行一个通用函数来确定返回哪种代码
try {
//your code here
} catch(YourException e){
Handler.handle(e);
}
其中
Handler.handle(e)
接受一个异常并确定关闭系统的整数。至少您有一个系统将关闭的集中点。如果您想要一些通用的东西:
interface ExceptionAction {
public void apply() throws Exception;
}
class Catcher {
public static void invoke(ExceptionAction ea) {
try{
ea.apply();
} catch(Exception e) {
System.exit(1);
}
}
}
然后通过创建lambda来调用。(您必须为捕获的局部变量设置任何“返回”值):
我要指出的是,这与
try
/catch
一样冗长,后者可能更具可读性/口语性。正如您可以尝试aspectJ或AOP概念一样,您必须为异常编写建议,并且可以使用System.exit()您当然可以使用System.exit(1)
中的仅在main
方法中尝试catch
。在所有其他地方,您要么删除catch
-块(如果它们不这样做的话)System.exit(1),要么从catch
-块中重新抛出异常,以便它最终在main
方法中被捕获。您可以调用一个单例类(例如.fatalError()
)在每个调用System.exit(1)
的catch块中,这样您将有更多的可维护性具有不同的值,这取决于引发异常的类型和引发异常的方法。每个代码都与一个唯一的错误标签相关联。例如:1代表错误配置文件,2代表某些持久性错误,等等。@AlexShesterov我想最好创建一个通用异常类,并将它们从m我的每个catch块,因此最终它将在我的主方法中被捕获,并使用系统退出一次。非常感谢您的想法。感谢您的建议,它也会工作,但现在,我将使用Alex的die,一个通用异常类,因为我只需要显示程序是否失败或通过,但您的想法将提供更多信息e freedom,我可以针对不同的异常使用不同的系统退出代码。想象一下你正在尝试做什么,并且相信这个程序不会是一个完整的应用程序,我还认为他的建议非常好,值得遵循!)
Catcher.invoke(() -> {
/// your code here
});