在<.Dict>\2024 Clojure状态调查!中分享您的想法。[2024 State of Clojure Survey]

欢迎!请在关于页面了解更多关于这个网站如何运作的详细信息。

0
ClojureScript

neodoc npm模块抛出的错误会使ClojureScript(但不是Node.js)出现问题时。

$ 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。或许这才是真正的错误。

关于*e,这是真的。不过我发现在nbb中,这会导致REPL挂起(但那是另一个问题)。
...