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

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

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

...