例如,当SBCL说
时值NIL不是CONS
类型
我想在执行错误时中断执行并调用调试器。
现在它一直冒泡到调用者(在我的情况下是Wookie异步Web服务器),默认错误处理函数报告它。在所述函数中调用(break)会调用调试器,但是使用Wookie的调用堆栈。
答案 0 :(得分:1)
我或许可以帮助解决您的问题。有两件事可能会发生。一个是你用
开始你的事件循环(with-event-loop (:catch-app-errors t) ...)
这实质上告诉cl-async你希望它捕获任何未处理的错误并为它们运行默认的事件处理程序。默认错误处理程序说"这是一个实际错误?所以电话(错误事件)。"这使得您的错误似乎来自cl-async的顶级错误。这背后的目的是你可以编写自己的错误处理程序来捕捉你认为合适的东西。
可能会发生的第二件事是你正在使用cl-async的未来,它还会通过将错误包装在自己的错误处理中来混淆错误。这使得future-handler-case宏可以实现异步词法错误处理。
因此,如果您收到错误并且您不知道在哪里,请执行以下操作:
;; do this *before* loading cl-async-future. this turns off ALL error capturing for
;; futures, letting your errors bubble up to top level without interference
(push :future-debug *features*)
;; ... load cl-async / wookie ...
;; tell cl-async not to catch errors
(cl-async:with-event-loop (:catch-app-errors nil) ...)
现在当你收到错误时,它应该冒泡到REPL并且你能够确切地看到它来自哪里。有一些方法(至少使用期货)可以获得在异步函数内部发生的错误的临时回溯,但这超出了答案的范围,并且假设你甚至在第一次使用期货时地方(虽然Wookie确实使用了它们)。
希望有所帮助!