gpt4 book ai didi

java - System.exit 的替代方案,可以将错误代码发送到批处理或 shell

转载 作者:行者123 更新时间:2023-12-02 04:37:11 26 4
gpt4 key购买 nike

我的 java 应用程序中有一组错误代码。目前我正在使用System.exit(code);将错误代码从应用程序返回到外部应用程序。有没有System.exit的替代品因为使用它是不好的做法,因为它可能会关闭整个 JVM。

最佳答案

我过去分享过您的经验,并尝试设计 System.exit()。一种可能性是不捕获 RuntimeException ,然后将 1 返回到 shell,但最终如果您想要比这更多的多功能性(并且不想要丑陋的堆栈) -trace 污染你的输出),你必须至少有“一次”调用System.exit()

public class Splat {

public static void main(String[] args) {

if (args.length > 0 && "splat".equals(args[0]))
throw new RuntimeException("splat");
}
}

输出:

 $ java Splat
$ echo $?
> 0
$ java Splat splat
> Exception in thread "main" java.lang.RuntimeException: splat
> at Splat.main(Splat.java:9)
$ echo $?
> 1

我这样做的原因是我们的组织开始使用声纳的静态分析结果作为 KPI,而我的工作就是降低数字。这是做任何事情的一个可怕的理由,但仍然是一个有趣的工程挑战......

我尝试的一种方法是抛出特定的 RuntimeException 类,并带有退出代码实例变量,并在外部范围捕获它。这样你就可以确定,当你杀死虚拟机时,你无论如何都处于堆栈的末尾......

public class Splat {

public static final class Exit extends RuntimeException {

private int exitCode;

public Exit(int exitCode) {
this.exitCode = exitCode;
}
}

public static void main(String[] args) {

try {

wrappedMain(args);

} catch (Exit e) {

System.exit(e.exitCode);
}
}

public static void wrappedMain(String[] args) {

if (args.length > 0 && "splat".equals(args[0])) {

int code = (args.length > 1) ? Integer.parseInt(args[1]) : 0;

throw new Exit(code);
}
}
}

输出:

 $ java Splat
$ java Splat splat
$ echo $?
> 0
$ java Splat splat 1
$ echo $?
> 1
> $ java Splat splat 2
$ echo $?
> 2
$ java Splat splat -1
$ echo $?
> 127

当然,这种方法有一些警告!这是一种有点奇怪的退出方式,任何不熟悉你的限制的人都会摸不着头脑。另外,如果稍后有人catch (Throwable t),那么你将无法退出!如果您在静态分析 CI 环境中工作,那么这应该很快被强调为更严重的违规行为!

关于java - System.exit 的替代方案,可以将错误代码发送到批处理或 shell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30613497/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com