2024年Clojure状态调查!

欢迎!有关如何操作的更多信息,请访问关于页面。

+1

在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字段的参考文档吗?

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

    (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中。

...