Найти и сообщить об ошибках компиляции Javascript в XULRunner с помощью nsIScriptContext или API-интерфейса SpiderMonkey - PullRequest
1 голос
/ 06 ноября 2010

У меня есть экспериментальная версия wxWebConnect (встраивание XULRunner в wxWidgets) в https://github.com/jonmmorgan/wxwebconnect/.. Он предлагает метод

wxString wxWebControl::ExecuteScriptWithResult(const wxString& js_code)

, который выполняет строку Javascript с использованием nsIScriptContext :: EvaluateStringWithValue, преобразует значениев строку с JS_ValueToString, а затем возвращает строку.

Однако в текущей реализации я обнаружил, что если строка Javascript синтаксически неверна (например, WebControl.ExecuteScriptWithResult ('{a: 2')), тогдапрограмма потерпит крах при попытке преобразовать результат в строку.Я обнаружил параметр aIsUndefined, который я могу использовать, чтобы определить, успешно ли выполнено выполнение скрипта, и предотвратить сбой.Тем не менее, это не помогает мне выяснить, в чем именно заключалась ошибка, и я думаю, что было бы хорошо сообщить об этом (как Firebug говорит мне «SyntaxError: missing} в составном операторе»).Насколько я могу видеть, даже использование чего-то вроде nsIScriptContext :: CompileScript просто скажет мне, была ли успешной компиляция, и не даст мне способа получить фактическую синтаксическую ошибку.

После http://chadaustin.me/2009/02/evaluating-javascript-in-an-embedded-xulrunnergecko-window/, Я пытался использовать JS_GetPendingException, но, похоже, он никогда не возвращает true.Даже когда я запускаю webcontrol.ExecuteScriptWithResult ("throw new Error ('a');"), у него все еще нет ожидающего исключения, но он говорит, что результат не определен.

Есть ли другой хороший способполучить ошибку компиляции или выполнения из nsIScriptContext или API-интерфейса SpiderMonkey?Любая идея, почему JS_GetPendingException, кажется, не делает этого?

1 Ответ

1 голос
/ 08 ноября 2010

Я действительно нашел ответ на это: В nsJSContext регистрируется функция сообщения об ошибках. Как часть этой функции репортера ошибок, она очищает ожидающие исключения. Если вы зарегистрируете свой собственный репортер ошибок, он переопределит это и позволит вам что-то сделать с ошибкой. Это означает, что ваша ошибка не появится в консоли ошибок. Я не знаю, потеряете ли вы другие важные функции, переопределив встроенный обработчик ошибок.

...