1

我在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 似乎没有这样做吗?

4

1 回答 1

1

我实际上已经找到了答案:在 nsJSContext 中,它注册了一个错误报告函数。作为该错误报告功能的一部分,它会清除待处理的异常。如果您注册自己的错误报告器,它会覆盖它并允许您实际处理错误。这确实意味着您的错误不会出现在错误控制台中。我不知道您是否会通过覆盖内置错误处理程序而丢失任何其他重要功能。

于 2010-11-08T12:19:08.330 回答