Frage

Ich hörte Leute sagen, Ausnahmebehandlung wegen des Stapels ist ein bisschen teuer Abwickeln.

Ich weiß nicht, etwas bekommen, der Stapel Abwickeln geschieht, ob ich eine Ausnahme aus, und ob ich „Rückkehr“ zu verwenden. Also, wo ist der Unterschied?

Wenn ich zum Beispiel ein Speicherproblem bekommen, dass ich nicht umgehen kann - die einzige Option ist die Funktion, bis die ich den Bereich erreichen zu stoppen, wo das Problem behandelt werden soll oder in Kenntnis gesetzt. Also, was ist meine andere Option für eine Ausnahme zu werfen?

kann ich „return“ statt werfen Ausnahme verwenden, aber dann ist es das gleiche. Ich weiß Stack Abwickeln können sogar sechs Stapel zurückgehen, aber so Rückgabewert überprüft und „Return“ kombiniert.

Eine Erklärung wird begrüßt werden.

War es hilfreich?

Lösung

Wenn Sie eine Rückkehr zu verwenden, ist der Stapel „abgewickelt“ bedingungslos, die vom Konzept her kann so einfach sein wie ein einzelnes „ret“ Maschinencode-Befehl ausgeführt wird. Unter Ausnahmen hat der Stapel Abwickeln nach einem geeigneten Exception-Handler zu suchen, die eine weitaus komplexere Aufgabe. Die Ausnahme Pfad hat auch die Aufgabe, den Bau und wahrscheinlich das Kopieren der Ausnahme-Objekt, das nicht trivial sein kann.

Andere Tipps

Stapel Abwickeln unterscheidet sich von einfach zurück. Es handelt sich auch um eine Suche nach einem Fehler-Handler (a catch-Block) in jeder unteren Ebene in dem Stapel. Das ist, was macht es zu einem schweren Prozess.

Deshalb sollten Sie nur Ausnahmen für wirklich außergewöhnliche Umstände nutzen sollten. Die Warnungen über die Ausnahmebehandlung sind für die Leute, die einfach nur eine Ausnahme als eine Möglichkeit sehen, Daten in dem Stapel höher zu liefern; Leute, die gerne „clever“ Programmierung zu tun. Sie denken, es ist ein cleverer Weg, um ein Problem zu bekommen, aber sie schaffen stattdessen zwei neue Probleme, die sie nicht erwartet hatten.

In der Regel sind Sie am besten wege Ausnahmen (zum wirklich außergewöhnlichen Umständen) statt Rückgabecodes, wie dies Ihr Code einfacher macht zu lesen und zu pflegen. Zum Beispiel ist die leichter zu lesen und zu pflegen?

void MyMethod()
{
    try
    {
        Method1(); 
        Method2();
        Method3();
    }
    catch(SomeException const & e) // edited per Mordachai's suggestion
    {
       // handle SomeException
    }
    catch(SomeOtherException const & e)
    {
       // handle SomeOtherException
    }
}

void MyMethod()
{
    int err;
    err = Method1();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
    err = Method2();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
    err = Method3();
    switch(err)
    {
        case SOMEERRORCODE:
             // handle some error code
             break;
        case SOMEOTHERERRORCODE:
             // handle some other error code
             break;          
    }
}

Die Geschwindigkeit der Fehlerbehandlungsmechanismen im Falle eines Fehlers ist unwichtig - sie sollten zu selten ausgeführt werden, um einen Einfluss auf die allgemeine Programmleistung zu machen (sie sind außergewöhnliche Veranstaltungen)

Wenn die Leute reden über die Ausnahmebehandlung teuer sie sprechen über die Wirkung, die sie auf die Leistung einer Funktion , wenn diese Funktion abgeschlossen ist, ohne eine Ausnahme Anhebung . Viele Compiler reduzieren diesen Aufwand auf nahezu Null -. Aber es gibt einige Plattformen, insbesondere Konsolen-Spiele, bei denen entweder die verfügbaren Compiler oder die Hardware-Ausnahmen nicht sehr gut im Griff

Es gibt einen kleinen „Kosten“ für die Infrastruktur benötigt Ausnahmen in erster Linie zu vermitteln. Dies war früher bedeutend genug sein, um viele Menschen gewählt haben, es zu vermeiden, und deaktivieren Sie RTTI zusammen. In diesen Tagen seine so unbedeutend, dass, wenn seine ein Problem als vielleicht C ++ ist bereits zu hoch Ebene für Sie; -)

Im Hinblick auf die Ausbreitung von Ausnahmen und Stack-Abwicklung gibt es zusätzlich Kosten, aber da (a) Sie würden die Stapel sowieso entspannen haben, wie Sie sagen (obwohl das nicht wirklich ist, wo die Kosten) und (b) Sie sind bereits auf eine Ausnahme Pfad, in dem die zusätzlichen Kosten wahrscheinlich ohnehin nie ein Problem.

Die meisten Menschen, die über die Kosten der Ausnahmebehandlung klagen denken, wie sie verwendet werden.

Wenn Sie Interesse an den Auswirkungen der Ausnahmebehandlung sind, hat auf die Leistung, die beste Wahl Lesen zu beginnen, ist die Technischer Bericht über C ++ Leistung (Kapitel 5.4 insbesondere).

Ich schlage vor, die Konzentration auf Qualität, Richtigkeit und Robustheit vor über die Leistung eines Programms besorgniserregend. Viele Anwender würden ein langsames Arbeitsprogramm auf einem schnell man sich vorziehen, dass Fehler oft.

Nachdem das Programm arbeitet, einen Profiler laufen und herausfinden, wo die meiste Zeit verbracht wird. Meine bescheidene Meinung ist, dass die Fehlerbehandlung ein bisschen länger dauern kann, da es weniger häufig geschieht.

Die meisten Versionen von Ausnahmebehandlung einig kleinen zusätzlichen Aufwand fügen Sie den Compilers befaßt sich mit Fragen wie Umfang zu helfen. Hier ist ein Artikel, der eine Erklärung hat. Das Kopf wir sprechen ist sehr klein und so gut wie nie die Mühe wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top