我遇到了以下問題(下面是一個最小範例)。這是個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