【问题标题】:How to find my own functions in a ClojureScript error message?如何在 ClojureScript 错误消息中找到我自己的函数?
【发布时间】:2017-10-02 00:50:14
【问题描述】:

我是 ClojureScript 的新用户,我正在使用 Re-frame 编写应用程序。当我收到一条错误消息(来自 ClojureScript)时,在大多数情况下,我会从库中获得一个以 JavaScript 代码结尾的调用堆栈。这是意料之中的,但我没有从堆栈中自己的代码中获得函数!有时,我根本没有得到任何 ClojureScript 函数调用,只有 JavaScript 调用。有没有办法在这些错误消息中查看堆栈顶部?或者查看堆栈中我的代码/命名空间中的最后一个函数?

这对我来说可能是一个巨大的帮助。即使是很小的错误(例如,在地图调用中交换操作员的位置)也很难跟踪。我应该做错了。

【问题讨论】:

    标签: error-handling clojure stack-trace clojurescript re-frame


    【解决方案1】:

    据说 ClojureScript 错误消息是后天习得的。由于编译器的工作方式,错误消息可能很神秘。

    安装cljs-devtools 或分支Dirac 可以帮助使ClojureScript 错误消息更具可读性。其中包括:

    1. :hints 功能。

      :hints 功能试图增加未捕获的异常和错误对象,以包含与此类错误相关的一些额外知识。它尝试获取原始源文件,提取相关部分以显示更多上下文并在那里标记 javascript 错误。预计这仅适用于 :optimizations none 编译器模式,默认情况下它是禁用的,因为它依赖于猴子补丁。

    2. 更好地显示ClojureScript function names

      更好的堆栈跟踪示例(来自 Dirac,但 cljs-webtools 已经改进了很多)

    安装

    • 启用自定义格式化程序
    • 使用CMD-ALT-J 打开 DevTools
    • 使用F1 或按三个点转到“设置”
    • 在控制台下勾选“启用自定义格式化程序”

    cljs-webtools

    (见Installation):

    • project.clj中为编译器添加配置

      {:builds
         [{:id           "dev"
           :source-paths ["src/cljs"]
           :figwheel     {:on-jsload "blabla.core/reload"}
           :compiler     {(...)
                          :preloads        [devtools.preload]
                          :external-config {:devtools/config {:features-to-install :all}}}}
      

    狄拉克

    • 安装Dirac Chrome extension
    • 在启用远程调试的情况下运行 Chrome。

      /Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary \
        --remote-debugging-port=9222 \
        --no-first-run \
        --user-data-dir=$A_PATH_TO_YOUR_USER_PROFILE_DIRECTORY
      
    • binaryage/dirac 添加到project.clj 中的依赖项

      :dependencies [[binaryage/dirac "RELEASE"]]
      

      (或使用另一个installation instructions)。

    如果您使用re-frame Leiningen template,则默认包含cljs-devtools

    【讨论】:

    • 我无法安装 Dirac(可能是因为我运行的是 Linux 并且没有 Chrome Canary)。 devtool 工作,但它没有添加太多信息。还有其他建议吗?
    • @dilvan 这是 CLJ/CLJS 体验中不幸的部分。做我所做的:习惯滚动。很快你就会知道你要去哪里以及如何发现最有用的错误。此外,如果您可以使用 Figwheel,它可能会产生更多有用的错误,直接切入正题。
    • @kennytilton CLJS 编译输出(不知何故)不显示来自core.cljs 的错误消息(或只显示其中的一小部分)不是更好吗?这将使每个人的信息更加清晰。
    • Clojure 1.9 引入了规范。 clojure.core 库中的函数有规范。如何设置 clojureScript 项目以使用规范并在运行时测试 clojure.core 函数?
    • @dilvan 嗯,我希望它能打印更多信息。对我来说确实如此。你能分享你的代码,你得到什么输出,你期望什么输出? clojure.specs 已针对 instrument 的输入进行验证。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多