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(但这是另一个问题)。
...