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

欢迎!请访问 关于 页面获取更多有关如何使用本站的信息。

0 投票
ClojureScript

neodoc npm 模块抛出的错误会导致 ClojureScript 出现问题(但不会影响 node)。

$ java -cp cljs.jar cljs.main --repl-env node
ClojureScript 1.10.758
cljs.user=> (def neodoc (js/require "neodoc"))
#'cljs.user/neodoc
cljs.user=>  (.run neodoc "Usage:\n  foo" (clj->js {:argv []}))                    
#js {}

cljs.user=>  (.run neodoc "Usage:\n  foo" (clj->js {:argv ["bar"] :dontExit true}))
Execution error () at (<cljs repl>:1).
null

cljs.user=> (try (.run neodoc "Usage:\n  foo" (clj->js {:argv ["bar"] :dontExit true})) (catch :default e (prn :e e)))
Execution error (TypeError) at (<cljs repl>:1).
Function.prototype.toString requires that 'this' be a Function

这在 node 中是可行的(尽管抛出的对象很奇怪)

Welcome to Node.js v16.13.2.
Type ".help" for more information.
> neodoc = require("neodoc")
{
  run: [Function: run],
  parse: [Function: parse],
  default: { run: [Function: run], parse: [Function: parse] }
}
> neodoc.run("Usage:\n  foo", {argv: ["bar"], dontExit: true})
Uncaught:
Function {
  message: 'foo: unknown command bar\n' +
    'Usage:\n' +
    '  foo\n' +
    'See foo -h/--help for more information',
  payload: {}
}
> try { neodoc.run("Usage:\n  foo", {argv: ["bar"], dontExit: true}) } catch (e) { console.log("e:", e) }
e: Function {
  message: 'foo: unknown command bar\n' +
    'Usage:\n' +
    '  foo\n' +
    'See foo -h/--help for more information',
  payload: {}
}
undefined

1 答案

0 投票

我认为它们的工作方式完全相同。您看到的不同之处在于,在 CLJS 中需要对函数使用 this,而在 NodeJS 中则不需要。但两种版本都会导致异常。毕竟,您的 NodeJS 版本也触发了其 catch 块。

话虽如此,只要您不尝试使用默认工具打印那个 Function,就应该不会有问题。

顺便说一下,不需要 try/catch。在 CLJS REPL 中您可以使用 *e 来获取最新异常。同样,在 NodeJS REPL 中您可以使用 _error

是的,毫无疑问。很有趣的是,我没有看到原生的方法可以打印这个对象,除非直接调用 js/console.log。也许这才是真正的bug。

关于 *e 的说法是对的,但我发现这个问题出现在 nbb 中,导致 REPL 挂起(但这是个单独的问题)。
...