2013-12-22 62 views
5

我使用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 

...它工作正常和錯誤捕獲。

我試圖改變字符串await db.find "79", defer c, d由其他簡單的異步函數calles,但他們工作正常,錯誤得到了很好的捕捉。

有趣的是,功能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

The documentation states以下的try catch聲明:

唯一的例外是try,從事件處理程序稱爲 主循環時不捕獲異常,出於同樣的原因手卷 異步代碼和try不能很好地協同工作。

我懷疑,既然db.find異步調用,該try結構仍然與db.find線程,並且不留在主線程。這會導致你描述的結果。

一個原始的解決方案是捕獲這兩個函數調用。但是,我認爲使用await的正確方法是使用defer函數。 Check out the documentation for an explanation.

此外,您可能會發現以下幫助:

可能的解決方案

  1. 廣場兩個語句圍繞一個嘗試捕捉。

    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的嘗試捕捉外,並檢測它是錯誤的另一種方式。

    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 
    
+0

謝謝!我應該如何改變try catch塊來捕獲'a.fake()'調用的錯誤?或者,單一的方法是從'try'塊中排除異步函數? –

+0

爲我的答案增加了一些解決方案。看看是否有幫助。 – JSuar