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
嗯...再仔细想想这个问题;问题可能是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
by

ex-message (位于核心中),它可以在Clojure和ClojureScript之间移植。

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

...