2017-01-02 207 views
4

有關的try-catch中的setTimeout處理錯誤

功能簡單的問題
try { 
    setTimeout(function() { 
     throw new Error('error!'); 
    }, 300) 
} catch (e) { 
    console.log('eeee!') 
    console.log(e) 
} 

爲什麼不工作抓塊?

我能讀什麼呢?

P.S:有關處理這種錯誤的可能性的問題。不回答有關承諾

回答

1

因爲catch塊在詞彙上圍繞着setTimeout調用,但這不是拋出的函數。 直接翻譯,是計劃與setTimeout運行在主循環執行,代碼的身體源於他們之外

setTimeout(function() { 
    try { 
    throw new Error('error!'); 
    } catch (e) { 
    console.log('eeee!'); 
    console.log(e); 
    } 
}, 300); 
8

功能。

處理錯誤,把try-catchsetTimeout處理程序中:

setTimeout(function() { 
    try { 
    throw new Error('error!'); 
    } catch (e) { 
    console.error(e); 
    } 
}, 300) 

如果您需要訪問從塊稱爲setTimeoutError對象,使用Promises

const promise = new Promise((resolve, reject) => { 
    setTimeout(function() { 
    try { 
     throw new Error('error!'); 
    } catch (e) { 
     reject(e) 
    } 
    }, 300) 
}) 

promise 
    .then(result => console.log("Ok " + result)) 
    .catch(error => console.error("Ouch " + error)) 

這上面的例子並不是用Promise來處理案件的最優雅方式。相反,實施delay(ms)功能是這樣的:

function delay(ms) { 
    return new Promise(resolve => setTimeout(resolve, ms)) 
} 

然後調用

delay(300).then(myFunction).catch(handleError) 
1

你可以找到很好的解釋這個Node.js加載官方doc

問題是,當您的setTimeout()函數的回調執行時,try { } catch(err) { }塊已退出。還要注意回調會導致Node.js進程崩潰。

但是,如果你要處理的setTimeout()功能的回調中的錯誤,那麼你可以通過使用process全球EventEmitter對象

process.on('uncaughtException', function(err){ 
    console.log(err) 
}) 
+0

聽他們這應該是公認的答案(提示,提示@Andrew科奇涅夫)因爲它實際解釋了爲什麼和最徹底。 – Jeach