如何让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
相关产品推荐
相关产品推荐

