在未处理的异常期间,JVM会引发什么信号(SIGTERM
,SIGINT
,...)?
例如,异常可能是java.lang.NumberFormatException
。
答案 0 :(得分:2)
未处理的异常不一定会导致JVM发出信号 - 这是不必要的:Java系统代码捕获异常并在那里处理(打印堆栈跟踪并退出)。
在某些情况下,JVM会发出信号以调用信号处理程序来记录更多诊断信息。
另一方面,Oracle JVM(例如)安装信号处理程序以捕获一些特定错误并将其转换为异常 - 有关详细信息,请参阅here。
编辑以跟进上面的注释,并基于指向源的链接(尽管您没有显示调用失败的Java程序AFAICT的脚本):
您安装的陷阱会导致shell解释器安装信号处理程序,以防它接收到SIGINT / ...如果子进程收到这样的信号,它们就不会被调用(加注导致有问题的进程接收信号 - 指示你需要使用杀人和朋友的另一个过程。
因此,即使JVM发出信号,shell也不会得到它。
在你的情况下可能发生的事情是bash被配置为在出错时退出(例如set -o errexit),因此锁定释放代码不会因为未处理而导致JVM的退出代码为非null而无法执行例外。
要解决此问题,请将ERR(可能是EXIT)添加到陷阱调用的signal_spec中。