You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让JShell遇异常时终止执行并返回退出码?

如何让JShell脚本遇异常时终止并返回错误码

你遇到的问题是JShell脚本默认在抛出异常后不会终止执行,仍会继续运行后续代码,且进程退出码为0。要实现捕获异常后终止脚本并返回非零错误码,可以通过以下方式处理:

原始问题复现

你的原始脚本代码:

int divide(int x, int y) {
    return x / y;
}

int a = divide(5,0);
int b = divide(4,2);
System.out.println("a=" + a);
System.out.println("b=" + b);
/exit

运行结果:

jshell example.jsh 
Exception java.lang.ArithmeticException: / by zero
      at divide (#1:2)
      at (#2:1)
a=0
b=2
echo $?
0

可以看到,即使出现除以零的异常,脚本依然执行了后续的变量定义和打印操作,且退出码为0,无法通过退出码判断脚本执行失败。

解决方案:使用try-catch捕获异常并终止进程

将可能抛出异常的代码包裹在try-catch块中,在catch块里调用System.exit(int)方法指定错误码,即可终止脚本并返回错误状态。

修改后的脚本代码:

int divide(int x, int y) {
    return x / y;
}

try {
    int a = divide(5, 0);
    int b = divide(4, 2);
    System.out.println("a=" + a);
    System.out.println("b=" + b);
} catch (ArithmeticException e) {
    System.err.println("执行错误: " + e.getMessage());
    System.exit(1); // 返回非零错误码,这里用1表示通用错误
}
/exit

代码说明

  • try块:包裹所有可能抛出异常的逻辑,当divide(5,0)触发ArithmeticException时,会立即跳转到catch块。
  • catch块:捕获指定类型的异常,打印错误信息后调用System.exit(1),该方法会立刻终止JVM进程,后续代码不会再执行。
  • 错误码:你可以根据实际需求设置不同的非零值(比如2表示参数错误,3表示IO错误等),只要是非零值都能标识脚本执行失败。

验证运行结果

执行修改后的脚本:

jshell example.jsh
执行错误: / by zero
echo $?
1

此时脚本在异常发生后立即终止,没有输出后续的a=0和b=2,且退出码为1,符合预期。

通用异常处理(可选)

如果你想捕获所有类型的异常并终止脚本,可以将catch块的异常类型改为Exception:

try {
    int a = divide(5, 0);
    int b = divide(4, 2);
    System.out.println("a=" + a);
    System.out.println("b=" + b);
} catch (Exception e) {
    System.err.println("脚本执行失败: " + e.getMessage());
    System.exit(1);
}

内容的提问来源于stack exchange,提问作者Ari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 03:05:07