我在https://github.com/jonmmorgan/wxwebconnect/有一个实验版本的 wxWebConnect(在 wxWidgets 中嵌入 XULRunner)。它提供了一种方法
wxString wxWebControl::ExecuteScriptWithResult(const wxString& js_code)
它使用 nsIScriptContext::EvaluateStringWithValue 执行 Javascript 字符串,使用 JS_ValueToString 将值转换为字符串,然后返回该字符串。
但是,我在当前实现中发现,如果 Javascript 字符串在语法上无效(例如 WebControl.ExecuteScriptWithResult('{a:2')),那么在尝试将结果转换为字符串时程序会崩溃。我发现了 aIsUndefined 参数,我可以使用它来确定脚本执行是否成功并防止崩溃。但是,这并不能帮助我找到实际的错误是什么,我认为报告它会很好(就像 Firebug 告诉我“SyntaxError: missing } in complex statement”)。据我所见,即使使用 nsIScriptContext::CompileScript 之类的东西也只会告诉我编译是否成功,并没有给我提供解决实际语法错误的方法。
在http://chadaustin.me/2009/02/evaluating-javascript-in-an-embedded-xulrunnergecko-window/之后,我尝试使用 JS_GetPendingException,但它似乎永远不会返回 true。即使我运行 webcontrol.ExecuteScriptWithResult("throw new Error('a');") 它仍然没有挂起的异常,但确实说结果未定义。
有没有其他好方法可以从 nsIScriptContext 或 SpiderMonkey API 获取编译或执行错误?知道为什么 JS_GetPendingException 似乎没有这样做吗?