Warum try und catch () in C ++ verwenden?

8

Ich verstehe, dass try und catch() für die Ausnahmebehandlung verwendet werden, nur für den Fall, dass in bestimmten Fällen ein Fehler oder Absturz im Programm auftritt. Ich verstehe auch, wie sie arbeiten. Warum aber try und catch() ? Warum nicht einfach eine if() -Anweisung verwenden, die nach einem bestimmten Fall sucht, und wenn dieser Fall wahr ist, wird cout << //error code ?

verwendet     
aanrv 14.02.2013, 02:18
quelle

5 Antworten

12

Ausnahmebehandlung:

  • kann mit Konstruktoren und Operatoren verwendet werden, die keine Möglichkeit haben, einen separaten Fehlercode zurückzugeben (sie könnten das Objekt in einen Fehlerzustand versetzen - was weitere Speicherauslastung bedeutet), aber der Clientcode muss auch nach diesem Fehler suchen Zustand später)
    • zum Beispiel: benutzerdefinierter Typ - Klasse X - unterstützt die Notation x1 = x2 + x3 - wo könnte ein Fehlercode zurückgegeben werden?
  • kann eintreten, wenn ein bestimmtes Klassen- / struct-Datenelement in einer Initialisiererliste erstellt wird - wodurch eine weitere Konstruktion von Datenelementen vermieden wird, die dann zum Scheitern verurteilt oder verschwenderisch ist; eine explizite Fehlerbehandlung ist dagegen erst später im Konstruktor-Body möglich.
  • ist implizit - betont den normalen, erfolgreichen Codefluss, der es prägnanter, lesbarer und wartbarer machen kann
  • wird anders berücksichtigt - Ausnahmen von vielen Orten können an einer Stelle abgefangen werden, wodurch der Fehlerbehandlungscode manchmal prägnanter, lesbarer und wartbarer wird
  • engineering Vorteile können tatsächlich zu einer zuverlässigeren Fehlerbehandlung in Fällen führen, in denen die Fehlerbehandlung sich ansonsten wiederholen würde
  • verwenden normalerweise ihren eigenen Speicherbereich, unabhängig von dem für lokale Variablen verwendeten Stack, Funktionsparametern, Speichern von CPU-Registern und Rückgabeadressen usw .; Dies bedeutet, dass eine throw-Anweisung in der Lage ist, das Ausnahmeobjekt direkt in diesem Speicherbereich zu erstellen, selbst wenn der verbleibende Stapelspeicher kleiner als das Ausnahmeobjekt ist (obwohl dies ein Implementierungsdetail ist und nicht vom Standard garantiert wird)
  • hat ein anderes Leistungsprofil, so dass beide unter bestimmten Umständen schneller sein können
  • erleichtert die Verbreitung von umfangreicheren Fehlerinformationen von Code auf niedriger Ebene bis hin zu Zwischencode, den Sie möglicherweise nicht "besitzen" oder ändern wollen, um Fehlercodes C-style bis zum Umgang mit
  • zu propagieren
Tony Delroy 14.02.2013, 02:27
quelle
5

try...catch macht mehr. Es wickelt den Stack ab, der die Destruktoren für alle automatisch zugewiesenen Objekte aufruft, seit die try eingegeben wurde. Wenn Sie dies auf die von Ihnen vorgeschlagene Art und Weise tun, müssen Sie diese Objekte manuell verfolgen oder es treten Speicherprobleme auf (Lecks, Überschreiben, veraltete Zeiger, doppelte Löschungen).

    
James 14.02.2013 02:22
quelle
1

Der andere Grund ist: Code, den Sie schreiben, könnte auch als Teil eines größeren Projekts von jemand anderem verwendet werden. Und da die Verwendung von integrierten Ausnahmebehandlungsroutinen ein Standard ist, erwarten die Betreuer des größeren Projekts, dass Sie Ihre Ausnahmen ebenfalls behandeln, so dass die Ausnahmebehandlung auf höheren Ebenen ordnungsgemäß erfüllt werden kann - ganz zu schweigen von der Tatsache, dass Standard verwendet wird Ausgabe als eine Fehlerausgabe ist eine zweifelhafte Übung (sie kann zum Beispiel unterdrückt werden oder überhaupt nicht verwendet werden).

UPD: Ich habe deine Frage ein wenig missverstanden. Der Grund, den ich beschrieben habe, rechtfertigt das manuelle Exception-Werfen, aber nicht try...catch Blöcke.

    
Vleseg 14.02.2013 02:41
quelle
-1

Ich werde mit einem Zitat von einem meiner Helden, Martin Sústrik von ZeroMQ, antworten, der aus einem Blogeintrag bei stammt Ссылка

  

Was jedoch großartig ist, um einfache Fehler zu vermeiden, wird zum Albtraum, wenn Sie sicherstellen wollen, dass kein undefiniertes Verhalten passiert. Die Entkopplung zwischen dem Auslösen der Ausnahme und ihrer Handhabung, die es in C ++ so einfach macht, Fehler zu vermeiden, macht es praktisch unmöglich, zu garantieren, dass das Programm niemals unbestimmtes Verhalten ausführt.

Und dann füge ich hinzu, dass ich try / catch für sehr hohe Hebel-Neustart-Ebenen verwende, mehr als alles andere. Hinzufügen, dass meine Meinung wirklich nicht wichtig ist. Ich bin der Überzeugung, dass die Wahl, wie und warum man die Ausnahmebehandlung benutzt, der Wahl sehr ähnlich ist, wenn man Grün mehr als blau mag. Persönliche und keine Eingabe von anderen wird es wahrscheinlich ändern.

    
Brian Tiffin 14.02.2013 02:35
quelle
-2

Die Frage stellt eine falsche Dichotomie dar . In Java und C # try - catch konkurriert mit if für die Bereinigung bei einem Fehler. In C ++ ist es hauptsächlich RAII-Technik (mit Destruktoren und Ein-Phasen-Konstruktion), die mit if für die Bereinigung bei einem Fehler konkurriert.

Wenn die Frage gewesen wäre, Ausnahmen im Gegensatz zur Verwendung von if zu verwenden, wäre dies sinnvoller und relevanter für die normale C ++ Programmierung.

    
Cheers and hth. - Alf 14.02.2013 02:45
quelle