我遇到了以下问题(下面是一个最小示例)。这是个bug还是我遗漏了什么?
(Windows 11,JMP 18.0)
以下脚本会导致 JMP 崩溃,而不是仅仅抛出错误:
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
与上述情况相反,如果没有回溯标志,通常会抛出“thrown”错误。
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown" ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
此外,通过将 Return() 捕获到 Try() 中,可以防止崩溃。
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Try( Return( sub_f() ), Throw( "crash prevented" ) )
);
f()
你发现了 JMP 的一个 bug,我已提交报告并指向此帖。你可以通过注释掉 sub_f 的局部变量来解决这个问题:
f = Function( {}, // { sub_f },
(我相当确定这个解释是正确的……)当 JMP 捕获到 throw() 异常时,局部变量已被销毁,回溯信息也随之丢失。生成回溯的代码对此毫无准备,因此会因无效内存引用而崩溃。如果你在函数内部添加了 try() 语句,JMP 就能在函数内部捕获到 throw 异常,此时局部变量尚未被销毁。或者,将函数放在全局变量中也能解决问题。
编辑:TS-00250890