5

try catchiced 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.finda.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

...它按预期工作并捕获了错误。

我试图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

4

1 回答 1

1

该文档说明了以下try catch声明:

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

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

一种粗略的解决方案是同时捕获两个函数调用。但是,我认为正确的使用方法await是使用该defer功能。查看文档以获取解释。

此外,您可能会发现以下内容很有帮助:

可能的解决方案

  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. 如上面链接中所述,放置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
    
于 2013-12-30T15:01:58.250 回答