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

欢迎!请查看 关于 页面获取更多关于如何工作的信息。

0 投票
ClojureScript

上下文:使用 cljs.spec.test.alpha/instrument 仪器化 fdef 化的函数。使用不符合参数规范的数据调用这些函数之一。当前抛出的异常没有提供很多上下文。

  1. 异常消息包含 "缺少文件名" 和 "缺少行号" ——理想情况下,这些应该包含违规调用的文件和行号。
  2. 异常数据被编码以包含有关调用者的信息,但当前实现在这里总是返回 nil

结果是,不符合 fdef 参数规范后,无法追踪到调用——它只能告诉你哪个函数的规范没有被满足。

我开始调查,并发现了一些故障,但我没有完整的建议。我在提供迄今为止的补丁,希望能够得到一些反馈,看看是否应该继续调查。

以下是我迄今为止发现的内容:

  1. **target** 被假定是 "browser",而文档中说明在浏览器中是 "default"。已在第一个补丁中修复。
  2. 尝试解析堆栈跟踪以查找调用者时,host 包含端口号。在第二个补丁中解决了这个问题。
  3. 尝试解析堆栈跟踪时,使用 goog.userAgent.product 来确定浏览器,但它并不可靠——例如,在响应式设计模式下,当 Chrome 是 product/IPHONE 时为真。这是错误的,在 cljs.spec.test.alpha 情况下也毫无帮助,因为该函数根本不识别 iPhone。由于用户代理仅用于解析堆栈跟踪,因此我通过从堆栈跟踪中推断用户代理来修复了这个问题。
  4. 使用错误的包名在 find-caller 函数中查找了 spec_checking_fn。此外,它将点硬编码到包名中,而一些浏览器使用 $。我在第四个补丁中修复了这个问题。我还将创建错误放置在 conform! 匿名函数之外,因为在这里放置它将使 spec-checking-fn 从堆栈跟踪中删除。

使用这些补丁,调用者被可靠地设置,尽管它似乎没有反映原始调用点。抛出的异常仍然缺少文件名和行号。如果您对最终接受这些补丁感兴趣,我很乐意继续调查并添加一些测试。

作为旁注:看起来从堆栈跟踪中推断用户代理的功能更适合放在 stacktrace.cljs 中,我强烈认为如果没有提供 user-agent-product,则应默认使用这种行为(而不是当前:返回未经修改的堆栈跟踪字符串)。如果您有兴趣,我很乐意修复这个问题并添加一些测试。请注意,当前的方法允许 Safari 沿着 Firefox 的路径走,效果非常出色。

最后:如果我在一个地方放的东西太多,我会很乐意按照指示将其拆分,对此表示歉意。

3 个答案

0 投票

评论作者:dnolen

谢谢!您提交了CA吗?

0 投票

评论作者:cjohansen

当然有了 :)

0 投票
参考:https://clojure.atlassian.net/browse/CLJS-2758(由 alex+import 发表)
...