Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果Java文件抛出异常,如何返回非零退出代码_Java_Shell_Sh - Fatal编程技术网

如果Java文件抛出异常,如何返回非零退出代码

如果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

我使用下面的脚本(.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

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
});