2017-01-02 3 views
4

Einfache Frage zu try-catch für die Funktion in SetTimeoutHandle Fehler von setTimeout

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

Warum arbeiten nicht catch-Block?

Was kann ich darüber lesen?

P.S: Frage über die Möglichkeit, Fehler wie diese zu behandeln. Lassen Sie sich nicht über Versprechungen antworten

Antwort

1

Da der catch-Block lexikalisch umgibt den setTimeout Anruf aber das ist nicht die Funktion, die wirft. Die direkte Übersetzung ist

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

Funktionen geplant mit setTimeout laufen in die Hauptschleife ausgeführt werden, außerhalb des Körpers des Codes, die ihnen entstanden sind.

Fehler zu behandeln, legen Sie die try-catch innerhalb des setTimeout Handler:

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

Wenn Sie das Error Objekt aus dem Block, der setTimeout genannt, Promises verwenden zugreifen müssen:

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)) 

oben Dieses Beispiel ist nicht die eleganteste Art, den Fall mit einem Promise zu behandeln. Stattdessen implementieren eine delay(ms) Funktion wie folgt aus:

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

Dann

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

Sie gute Erklärung finden können rufen in dieser offiziellen doc node.js.

Das Problem ist, dass, wenn der Rückruf Ihrer setTimeout() Funktion ausgeführt wird, der try { } catch(err) { } Block bereits beendet ist. Beachten Sie auch, dass der Callback den Prozess Node.js zum Absturz bringen kann.

Allerdings, wenn Sie die Fehler in der Rückruf von setTimeout() Funktion behandeln möchten, dann können Sie sie mithilfe von process Objekt global EventEmitter

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

hören Dies sollte die akzeptierte Antwort (Hinweis: Hinweis @ Andrew Kochnev) sein weil es tatsächlich erklärt warum und am gründlichsten ist. – Jeach

Verwandte Themen