尝试捕获并不总是在冰咖啡脚本中工作

时间:2013-12-22 16:39:44

标签: error-handling iced-coffeescript

我在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之后无法捕获错误。

1 个答案:

答案 0 :(得分:1)

The documentation states关于try catch陈述的以下内容:

  

唯一的例外是try,它在调用时不会捕获异常   从事件处理程序的主循环,出于同样的原因手动滚动   异步代码和try不能很好地协同工作。

我怀疑由于db.find被异步调用,try结构仍保留在db.find线程中,并且不会保留在主线程中。这将导致您描述的发现。

一个原始解决方案是捕获两个函数调用。但是,我认为使用await的正确方法是使用defer函数。 Check out the documentation for an explanation.

此外,您可能会发现以下内容:

可能的解决方案

  1. 在两个陈述中放置一个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
    
  2. 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