6

在 Ubuntu 10.04.1 LTS 上的 FireFox 5.0 中运行的 ClojureScript 程序中,当抛出异常时,我得到一条神秘的线。

'错误:没有为类型对象定义协议方法 ISeqable.-seq:[object Object]' 调用方法时:[nsIDOMEventListener::handleEvent]

“-seq”位对我来说似乎很奇怪,我已经搜索了生成的 javascript 文件并没有找到它。

我希望我没有遗漏一些完全明显的东西,但是如何获得抛出异常的堆栈跟踪?你如何调试你的脚本?

4

2 回答 2

3

不幸的是,错误的堆栈跟踪依赖于浏览器的支持。大多数(全部?)浏览器将允许您通过取消引用“堆栈”字段以字符串形式访问堆栈跟踪的固定版本(通常是前 10 个元素,iirc),因此您可以执行以下操作:

(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 中使用它们。但是,如果您想获得有用的行号,您可能需要编写几个宏来注入代码以打印到控制台,否则您的所有行号都将指向您的打印函数。

于 2013-03-07T11:51:18.740 回答
1

看起来您正在将 Javascript 对象传递给需要 Clojure 序列的 Clojurescript 函数。尝试(my-function (js->clj my-thing))编辑:或者,我猜您在不需要的地方使用 (.strobj)

于 2011-10-09T23:37:03.230 回答