Получение следов стека в ClojureScript - PullRequest
6 голосов
/ 05 октября 2011

В моих программах ClojureScript, работающих в FireFox 5.0 на Ubuntu 10.04.1 LTS, я получаю одну зашифрованную строку при возникновении исключения.

'Ошибка: не определен метод протокола ISeqable.-seq для типа объекта: [объект-объект]' при вызове метода: [nsIDOMEventListener :: handleEvent]

Бит "-seq" мне кажется странным, и я искал сгенерированные файлы javascript и не нашел его.

Надеюсь, я не пропускаю что-то совершенно очевидное, но как мне получить трассировку стека для генерируемого исключения? Как вы отлаживаете свои скрипты?

Ответы [ 2 ]

2 голосов
/ 07 марта 2013

К сожалению, следы стека от ошибок зависят от поддержки браузера.Большинство (всех?) Браузеров позволят вам получить доступ к стандартной версии трассировки стека (обычно 10 лучших элементов, iirc) в виде строки, разыменовав поле 'stack', так что вы можете сделать что-то вроде этого:

(try ...throws...
    (catch js/Error e
        (.log js/console (.-stack e))))

Тем не менее, трассировки стека строк не очень веселые, вы не можете щелкнуть их, чтобы перейти к источнику.Лучше распечатать каталог исключений на консоли javascript (если он доступен), чтобы распечатать трассировки стека с интерактивными ссылками.Например,

(try ...throws...
    (catch js/Error e
        (.log js/console e)))

По крайней мере, в Chrome, это работает, только если консоль javascript была открыта при возникновении ошибки.Это отлично подходит для отладки, но менее полезно, когда ошибка была неожиданной.

Консольные объекты javascript, предоставляемые большинством браузеров, имеют множество полезных функций, которые вы можете использовать из clojurescript.Если вы хотите получить полезные номера строк, вы, вероятно, захотите написать пару макросов, чтобы внедрить код для печати в консоль, иначе все номера строк будут указывать на вашу функцию печати. ​​

1 голос
/ 10 октября 2011

Похоже, вы передаете объект Javascript в функцию Clojurescript, которая ожидает последовательность Clojure. Попробуйте (my-function (js->clj my-thing)) edit: или, я полагаю, вы используете (.strobj) там, где вам не нужно

...