throw
Können wir nicht einfach eine Fehlermeldung direkt auslösen, da wir mit dem Schlüsselwort in Javascript alles auslösen können?
Kennt jemand einen Haken daran?
Lassen Sie mich noch etwas Hintergrundwissen hinzufügen: In der JavaScript-Welt verlassen sich die Benutzer häufig auf die Parameterprüfung, anstatt den Try-Catch-Mechanismus zu verwenden. Daher ist es sinnvoll, nur schwerwiegende Fehler mit zu werfen throw
. Um jedoch einige Systemfehler abfangen zu können, muss ich für meine eigenen Fehler eine andere Klasse verwenden. Anstatt eine Unterklasse von Error zu erstellen, sollte ich einfach String verwenden.
javascript
billc.cn
quelle
quelle
throw new Error
undthrow someObject
in JavaScript?Antworten:
Es ist in Ordnung, alles zu werfen, was Sie möchten, aber denken Sie daran, dass, wenn der Fang außerhalb Ihres eigenen Codes liegt, möglicherweise eine vollständige Fehlerinstanz und keine einfache Zeichenfolge erwartet wird.
quelle
.message
Eigenschaft vonError
eine Zeichenfolge ist, versuchen, eine Zeichenfolgenmethode darauf aufzurufen, und explodieren.a @ main.js:4 (anonymous) @ main.js:7
Ja, Sie können andere Werte werfen , aber es ist keine gute Praxis .
Eine Zeichenfolge ist kein Fehlerobjekt und enthält keine nützlichen Debugging-Informationen. Devtools stützen sich darauf, wie z. B. die Datei und die Zeile, in der der Fehler erstellt wurde, die Stapelverfolgung am
throw
Speicherort usw., die als Eigenschaften fürError
Objekte verfügbar sind .Wenn Sie daran denken, einen primitiven Zeichenfolgenwert zu werfen, werfen Sie
new Error("<the string>")
stattdessen einen.quelle
.stack
Eigenschaft, die für eine automatisierte Fehlerbehandlung nützlich sein kann (z. B. beim Einrichten einer automatisierten Fehlerberichterstattung an einen Server, damit Sie Fehler beheben können, die in der Produktion schief gehen), aber das ist eher ein Randfall. Das tägliche manuelle Debuggen im Browser funktioniert einwandfrei, wenn Sie Zeichenfolgen werfen.Sie können Fehler mit Nachrichten auslösen, wissen Sie.
try { throw new Error("This is an error"); } catch (e) { alert(e.message); // This is an error }
Aber Sie können tatsächlich Fäden werfen:
try { throw "This is an error"; } catch (e) { alert(e); // This is an error }
quelle
Error
Objekte mit benutzerdefinierten Nachrichten zu werfen . Es erspart Ihnen die Mühe, nach dem Fehlertyp zu suchen, um "Ihre" Fehler von anderen nativ generierten Fehlern zu unterscheiden ... Es sei denn, Sie möchten dies natürlich absichtlich tun (und dann möglicherweise dieError
Objekte erneut in dencatch
Bereich werfen ). .Wie andere oben erwähnt haben, müssen Sie, wenn Sie kein Fehlerobjekt werfen, Try / Catch-Blöcke haben, um diese Objekte abzufangen und angemessen zu behandeln, oder sich in einer Welt voller Verletzungen beim Debuggen befinden.
Wenn es jedoch darum geht, Fehler für nicht fehlerbehandelte Zwecke wie die Steuerung des Programmflusses auszulösen, kann dies eine hilfreiche Methode sein, um sie
throw
fehlerfrei zu verwenden.Wenn Sie zur Steuerung des Programmflusses Throws verwenden, kann dies in jeder Sprache ineffizient sein, da die Laufzeit häufig viel Aufwand erfordert, um die Informationen zum Aufrufstapel abzuwickeln und die Daten so zu serialisieren, dass sie dem Benutzerbereich zur Verfügung stehen. Indem Sie die Fehlererstellung vermeiden, können Sie diesen Leistungseinbruch vermeiden. Der Schlüssel ist, dass Sie einen Handler im Aufrufstapel haben müssen, der weiß, wie man mit dieser Situation umgeht. Wenn Sie beispielsweise
throw {isHardStop: true, stopCode: SOME_CODE}
die Handler so gestalten, dass dies erkannt wird, können Sie möglicherweise einen Teil Ihres Codes reduzieren oder eine sauberere Syntax wählen.Ihr Handler für diesen Leiterfall könnte wie folgt aufgebaut sein:
try { ... } catch(thr) { if(!thr){ // Is not Error or Json - Handle accordingly } else if(thr.isHardStop){ // Handle the stop } else { // Most likely a real error. Handle accordingly } }
quelle
Obwohl Sie jede Art von Daten werfen können, die Sie möchten, ist dies beim Debuggen nicht optimal. Ein JS-
Error
Objekt enthält alle Arten von Informationen zum Fehler und eine Nachricht. Während eine Zeichenfolge nur eine Nachricht enthalten kann.Diese zusätzlichen Informationen umfassen:
Hier ist zum Beispiel ein Stacktrace von Chrome Devtools:
quelle