我有一个 wxWebConnect 的实验版本(在 wxWidgets 中嵌入 XULRunner),位于 https://github.com/jonmmorgan/wxwebconnect/ 。它提供了一种方法
wxString wxWebControl::ExecuteScriptWithResult(const wxString& js_code)
它使用 nsIScriptContext::EvaluateStringWithValue 执行 Javascript 字符串,使用 JS_ValueToString 将值转换为字符串,然后返回该字符串。
但是,我发现在当前的实现中,如果 Javascript 字符串在语法上无效(例如 WebControl.ExecuteScriptWithResult('{a:2')),则在尝试将结果转换为字符串时程序会崩溃。我发现了 aIsUndefined 参数,我可以用它来确定脚本执行是否成功并防止崩溃。然而,这并不能帮助我找到实际的错误是什么,我认为最好报告一下(就像 Firebug 告诉我“SyntaxError:复合语句中缺少 }”)。据我所知,即使使用像 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 似乎没有这样做吗?
最佳答案
我实际上已经找到了这个问题的答案: 在 nsJSContext 中,它注册了一个错误报告函数。作为错误报告器功能的一部分,它清除未决的异常。如果您注册自己的错误报告器,它会覆盖该错误报告器并允许您实际对错误执行某些操作。这确实意味着您的错误不会出现在错误控制台中。我不知道您是否会因覆盖内置错误处理程序而丢失任何其他重要功能。
关于javascript - 使用 nsIScriptContext 或 SpiderMonkey API 在 XULRunner 中查找并报告 Javascript 编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111602/