2024年Clojure状态调查!分享您的想法。

欢迎!请查看关于页面了解有关如何使用本站的更多信息。

+1
ClojureScript

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

2 答案

0

被选中
 
最佳答案

我们可以在这里添加它

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

但我找不到有关Error#error字段的任何参考资料

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

你是否有关于.error字段的参考资料文档?

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

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

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

观察发现,第二种形式更符合浏览器(我正在使用Chrome)。

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

我同意这种行为没有被记录下来很奇怪,我找不到关于为什么的参考。了解这一点会很好,所以我将进行更多研究,但到目前为止,我还没有发现什么。
嗯,再想想这个问题;也许问题是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
哦,实际上`pr-writer-ex-info`似乎是在异常流经控制台时引入附加格式化的地方。
toString的重写确实对打印异常有效。
所以,它看起来是有意为之的,目的是在有数据时暴露数据和原因。
我将关闭PR。
0

存在一个名为ex-message(位于核心部分)的特性,它可以在Clojure和ClojureScript之间移植。

这实际上是ClojureScript首先拥有的特性,后来被反向移植到Clojure中。

...