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

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

+1
ClojureScript

在ClojureScript中抛出ex-info时,默认行为是打印一个详细而难以理解的对象版本。这是因为Java使用一个message字段,而JavaScript期望一个error字段。一个简单的解决方案是执行(set! (.-error ex) (.-message ex)),将message字段复制到error中。这样做可以在浏览器中产生一个更清晰的异常显示。我建议这么做,以便下游使用者仍然可以依赖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`似乎是在异常流通过控制台时引入额外格式化的地方
The override of toString does kick in for printing exceptions.
所以看起来这是故意的,其目标是当存在时暴露数据和不安全因素。
I'll close the PR.
0
by

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

这实际上是ClojureScript首次出现,后来被反移植到Clojure。

...