2024 年 Clojure 调查问卷 中分享您的想法!

欢迎!有关该系统的工作方式,请参阅 关于 页面以获取更多信息。

0
ClojureScript

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

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

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

我开始调查,发现了一些问题,但我没有完整的建议。我在这里提供迄今为止的补丁,希望得到一些反馈,以确定是否值得我继续进行调查。

到目前为止,我发现了以下内容

  1. **目标** 程序默认为 "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
by

由:dnolen发表的评论

谢谢!您提交CA了吗?

0
by

由:cjohansen发表的评论

当然了 :)

0
by
参考:[https://clojure.atlassian.net/browse/CLJS-2758](https://clojure.atlassian.net/browse/CLJS-2758)(由alex+import报告)
...