2024年Clojure调查问卷中分享您的想法!

欢迎!有关本网站的工作原理,请参阅关于页面以获取更多信息。

+1
ClojureScript

在ClojureScript中抛出ex-info时,默认行为是打印一个冗长且难以理解的对象版本。这是因为Java使用一个message字段,而JavaScript期望一个error字段。一个简单的解决方案是执行(set! (.-error ex) (.-message ex));将message字段复制到error。这样做的结果是在浏览器中显示更清晰的异常。我建议复制,这样ex-info的后续用户还可以继续依赖于message的存在。这将是ClojureScript的一个好的改动吗?

2 答案

0

被选中
 
最佳答案

我们可以在这里添加它

https://github.com/clojure/clojurescript/blob/master/src/main/cljs/cljs/core.cljs#L11479

但在MDN中找不到任何关于Error#error字段的引用

https://mdn.org.cn/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#instance_properties

您是否有关于.error字段的参考文献?

by
观察行为就是尝试抛出这两个表达式

    (throw (ex-info "oh no" {}))

    (throw (set! (.-error (ex-info "oh no" {})) "oh no"))

并且观察到第二种形式更符合浏览器(我在使用Chrome)。

@Enzzo
是的,我同意这是一个添加的良好位置... 我已经创建了 https://github.com/clojure/clojurescript/pull/107

我觉得这种行为没有文档很奇怪,我无法找到关于这个问题的参考资料。最好了解一下这个,所以我将进行更多研究,但到目前为止我还没有找到任何东西。
by
Hmmm 正在更多思考这个问题;也许问题是ClojureScript覆盖了toString的方式

    (set! (.. ExceptionInfo -prototype -toString)
      (fn []
        (this-as this (pr-str* this))))

^^ 默认的js/Error toString是名称 + 信息

然而我尝试用默认的toString来覆盖它,但没有看到任何区别,所以我的方法可能是错误的,或者toString是不相关的。我尝试覆盖它的方法是在抛出异常之前将这段代码放在代码中

    (set! (.. ExceptionInfo -prototype -toString)
          (fn []
            (this-as this (str "z" (.-name this) (.-message this)))))

/shrug
by
哦,实际上 `pr-writer-ex-info` 似乎是在异常流向控制台时引入额外格式的位置。
toString的覆盖确实适用于打印异常。
所以这看起来是有意为之,其目的是在有数据和原因的情况下暴露它们。
我将关闭PR。
0

在核心库中有ex-message(可在Clojure和ClojureScript之间移植)。

这是ClojureScript最初具有,后来反向移植到Clojure的功能。

...