39 Stimmen

Warum wird Try/Catch nicht häufiger in JavaScript verwendet?

Bei anderen Sprachen, die Try/Catch unterstützen, scheint es so zu sein, dass die Entwickler diese Funktion mehr nutzen als in JavaScript. Gibt es dafür einen Grund? Ist die JS-Implementierung von Try/Catch mangelhaft?

41voto

Chase Punkte 28579

Schauen Sie sich diesen Artikel an: http://dev.opera.com/articles/view/efficient-javascript/?page=2#trycatch

Aus dem obigen Link:

Das try-catch-finally-Konstrukt ist ziemlich einzigartig. Im Gegensatz zu anderen Konstrukten, ist es erstellt zur Laufzeit eine neue Variable im aktuellen Bereich . Dies geschieht jedes Mal wird die catch-Klausel ausgeführt, wobei das abgefangene Ausnahmeobjekt einer Variablen zugewiesen wird. Diese Variable existiert nicht in anderen Teilen des Skripts, auch nicht innerhalb desselben Bereichs. Sie wird zu Beginn der catch-Klausel erstellt und am Ende der Klausel zerstört.

Da diese Variable zur Laufzeit erzeugt und zerstört wird, stellt sie einen Sonderfall in der Sprache dar, einige Browser verarbeiten sie nicht sehr effizient y die Platzierung eines Catch-Handlers innerhalb einer leistungsrelevanten Schleife kann zu Leistungsproblemen führen, wenn Ausnahmen abgefangen werden .

Sie können sich auch eine ähnliche Frage ansehen ici

UPDATE

Hinzufügen eines Links zu: https://github.com/petkaantonov/bluebird/wiki/Optimization-killers da sie nützliche Informationen über V8 und dessen Umgang mit diesen (und ähnlichen) Konstrukten enthält.

Im Besonderen:

Derzeit nicht optimierbar:

  • Generator-Funktionen
  • Funktionen, die eine for-of-Anweisung enthalten
  • Funktionen, die eine try-catch-Anweisung enthalten
  • Funktionen, die eine try-finally-Anweisung enthalten
  • Funktionen, die eine zusammengesetzte let-Zuweisung enthalten
  • Funktionen, die eine zusammengesetzte const-Zuweisung enthalten
  • Funktionen, die Objektliterale enthalten, die proto , oder erhalten oder Set-Deklarationen.

Wahrscheinlich niemals optimierbar:

  • Funktionen, die eine Debugger-Anweisung enthalten
  • Funktionen, die buchstäblich eval() aufrufen
  • Funktionen, die eine with-Anweisung enthalten

15voto

MicronXD Punkte 2168

Nein, es ist nicht fehlerhaft, aber für synchronen Code ist es in der Regel einfacher und sauberer, Dinge mit Ihrem eigenen Code zu überprüfen, als eine klobige try{}catch(e){} .

の例です:

var container = document.getElementById("timmy");
container.innerHTML = "I'm timmy!";

Wenn es kein Element gibt, dessen ID "timmy" ist, können wir das auch so handhaben:

try
{
    container.innerHTML = "I'm timmy";
}
catch (error)
{
    //handle no container
}

oder:

if(container) container.innerHTML = "I'm timmy";
else //handle no container

Eine weitere Sache zu beachten ist JavaScript-Anwendungen sind ereignisgesteuert und Try / Catch-Blöcke in den wichtigsten Teil Ihres Programms kann nicht fangen Fehler, die in Ereignis-Callbacks auftreten.

の例です:

sqlConnection.query("SELECT * FROM table", 
    function(){console.log("queried!");});

der einen nativen Code auslöst, der im weiteren Verlauf des Programms ausgeführt wird. Wenn ein Fehler auftritt, können Sie nicht erwarten, dass Ihr Programm bis zu dieser Zeile zurückgeht, damit Ihr Fehlerbehandlungsprogramm seine Arbeit tun kann! Stattdessen müssen Sie Fehler im Rückruf selbst behandeln. Es ist gängige Praxis, Rückrufe mit allen aufgetretenen Fehlern zu versehen, indem man sie als ersten Parameter übergibt.

sqlConnection.query("SELECT * FROM table", 
    function(error, data){
        if(error) console.log("query failed");
        else console.log("queried!");
    });

Wenn Ihr Code in einem Callback fehlschlägt, können Sie ihn alternativ so behandeln, wie ich es oben erwähnt habe.

link.onclick = function(e)
{
    var popUp = document.getElementById("popup");
    if(!popUp)
        return true; //follow link if no pop-up exists
    popUp.style.display = "block";
};

9voto

Sruly Punkte 9910

Die asynchrone Natur der meisten Javascript-Code versteckt die Try / Catch auf einem niedrigen Niveau und ruft dann einen Fehler Callback.

Die meisten schweren Code in js ist async und verwendet einen Rückruf oder Versprechen Muster. Der andere Code ist einfach und erfordert kein try/catch.

Wenn Sie in js-Bibliotheken graben (wählen Sie Ihre Favoriten) finden Sie die Try / Catch-Blöcke, die viel von der schweren app Code, der in modernen js-Anwendungen ausführt wickeln. Diese Bibliotheken rufen dann den Fehler- oder Fail-Callback auf, den Sie in vielen Js-Codebeispielen sehen.

2voto

Cruril Punkte 450

Ich glaube, dass es mehr Overhead mit einem Try/Catch im Gegensatz zu einer if-Anweisung gibt, obwohl ich denke, dass es nur wichtig ist, wenn die Ausnahme tatsächlich ausgelöst wird. Ich verwende try/catches oft, aber nur, wenn ich weiß, dass eine gute Chance besteht, dass eine Ausnahme ausgelöst werden könnte.

Bei effizientem Einsatz gibt es eigentlich keinen Grund, kein Try/Catch zu verwenden.

0voto

geekman Punkte 2194

JavaScript braucht sie nicht oft, weil es kaum einen Grund gibt, Fehler abzufangen, denn ein Fehler hält nicht das ganze Skript an. Javascript ist ereignisgesteuert, die meisten Funktionen werden ausgeführt, wenn ein bestimmtes Ereignis eintritt, und es ist clientseitig, also wenn etwas schief geht, geht es schief, das Abfangen und Behandeln des Fehlers wäre kaum von Vorteil. nur meine Ansicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X