我在try catch
中使用iced coffee script
块。我调用不存在的对象fake
的方法a
,并期望捕获错误。
db = require '../../call/db.iced'
try
await db.find "79", defer c, d
a.fake()
catch error
console.log "error catched"
console.log error
但是在调用函数db.find
之后a.fake()在控制台中抛出错误,但它没有按预期使用try catch
块。
如果我注释掉字符串await db.find "79", defer c, d
...
db = require '../../call/db.iced'
try
# await db.find "79", defer c, d ############## commented out
a.fake()
catch error
console.log "error catched"
console.log error
...它按预期工作,并且错误被捕获。
我试图通过其他简单的异步函数calles更改字符串await db.find "79", defer c, d
但它们工作正常并且错误很好。
有趣的是,函数db.find
运作良好。当我注释掉字符串a.fake()
...
db = require '../../call/db.iced'
try
await db.find "79", defer c, d
#a.fake() ################################ commented out
catch error
console.log "error catched"
console.log error
...此脚本可以正常运行,因此不会出现错误。
无法弄清楚为什么我在函数await db.find "79", defer c, d
之后无法捕获错误。
答案 0 :(得分:1)
The documentation states关于try catch
陈述的以下内容:
唯一的例外是
try
,它在调用时不会捕获异常 从事件处理程序的主循环,出于同样的原因手动滚动 异步代码和try
不能很好地协同工作。
我怀疑由于db.find
被异步调用,try
结构仍保留在db.find
线程中,并且不会保留在主线程中。这将导致您描述的发现。
一个原始解决方案是捕获两个函数调用。但是,我认为使用await
的正确方法是使用defer
函数。 Check out the documentation for an explanation.
此外,您可能会发现以下内容:
可能的解决方案
在两个陈述中放置一个try catch。
try
await db.find "79", defer c, d
catch error
console.log "error catched"
console.log error
try
a.fake()
catch error
console.log "error catched"
console.log error
As described in the link above,将db.find
置于try catch之外,并以另一种方式检测错误。
await db.find "79", defer err, id
if err then return cb err, null
try
a.fake()
catch error
console.log "error catched"
console.log error