2016-09-21 2 views
0

Ich arbeite hauptsächlich mit Nodejs (aber ich bin im Allgemeinen neu zu Javascript im Allgemeinen), aber genauer expressjs. Sie schlagen ausdrücklich vor, das Try-and-Catch-Muster zu verwenden, aber ich habe gesehen, dass andere vorschlagen, zuerst den versuchten und wahren Fehler zu machen.ist versuchen, Fangmuster besser als Fehler zuerst?

heißt

callback(err, data) { 
if (err) throw err; 
//do something if no error was returned 
} 

statt

callback(err, data) { 
    try { 
    //do something 
    } catch(err) { 
    //handle the error 
    } 
} 

Welches weit der bessere Weg, Dinge zu tun gilt? Javascript ist sehr zweideutig, wenn es darum geht, "den einzig wahren Weg" zu finden, etwas zu tun.

+3

Ihr zweites Beispiel nicht wirklich Sinn machen. Zu dem Zeitpunkt, an dem "Callback" aufgerufen wird, ist der Fehler * bereits * passiert oder nicht eingetreten, und "err" ist der Fehler (falls es der Fall ist) oder "null" (falls nicht). Dies liegt an der asynchronen Natur der meisten Node-API-Aufrufe, daher gibt es diesen Standardvertrag für Rückrufe: Der erste Arg ist ein Fehler (falls vorhanden), der zweite ist Daten (falls vorhanden). (Wenn die API heute entworfen würde, würde sie Versprechungen verwenden, und tatsächlich gibt es Bridging-Bibliotheken.) –

+0

Versuchen Sie zu fangen, kann nicht durch V8 optimieren! –

+0

Sie fangen etwas, das geworfen wird; hier wird 'err' eingegeben: der Fehler ist schon passiert. –

Antwort

3

Es gibt einen wichtigen Unterschied - "Error-First" Ansatz ist für asynchrone Aufrufe, Try-Catch ist für synchrone.

Wenn Sie einige externe Bibliotheken verwenden, liegt es an ihnen zu bestimmen, wie Fehler behandelt werden müssen. Manchmal gibt es Optionen (zum Beispiel 'fs' Modul der Knoten - synchrone Funktionen werfen Fehler und es liegt an Ihnen, sie zu fangen, asynchrone zurückgeben Fehler im Rückruf)

Wenn Sie Ihre eigenen Funktionen implementieren, " Fehler zuerst "Ansatz sieht besser aus, nur weil es Knoten asynchrone Natur passt.

(und ein weiterer Grund, nicht zu verwenden try-catch - V8-Optimierer kann keine Funktionen optimiert mit dieser Konstruktion so gut, als ob es nicht da war)

+0

Warum ist der Fehler zuerst nur für Async? Ich schreibe eine synchrone Funktion, die entweder ein Ergebnis oder einen Fehler zurückgeben kann. Gibt es einen Grund, in diesem Szenario keinen Fehler zuerst zu verwenden? – stone

Verwandte Themen