Frage

So gut wie überall jedes Stück Beispielcode läßt Fehlerbehandlung (weil es „das Problem verwirrt“, dass die Beispiel-Code-Adressierung). Meine Programmierkenntnisse kommen in erster Linie aus Büchern und Websites, und Sie nur selten ein Fehler sehen überhaupt dort im Einsatz Handling, allein gute Sachen lassen.

Wo sind einige Orte, gute Beispiele für C ++ sehen Fehlerbehandlung Code? Spezifische Bücher, bestimmte Open-Source-Projekte (vorzugsweise mit den Dateien und Funktionen zu sehen), und bestimmte Webseite oder Websites werden alle dankbar angenommen werden.

War es hilfreich?

Lösung

Herb Sutter und Andrei Alexandrescu Buch C ++ Coding Standards mit insgesamt kommt Kapitel über Fehlerbehandlung und Ausnahmen mit

  • Behaupten zügig interne Annahmen und Invarianten zu dokumentieren
  • Stellen Sie eine vernünftige Fehlerbehandlung Politik, und folgen sie streng
  • Unterscheiden zwischen Fehlern und Nicht-Fehler
  • Aufbau und Schreibfehler sicheren Code
  • Bevorzugen Ausnahmen verwenden, um Fehler zu melden
  • Wurf nach Wert, fängt durch Verweis
  • Bericht, Griff, und übersetzt Fehler in geeigneter Weise
  • Vermeiden Ausnahme Spezifikationen

Jedes Thema enthält auch ein Beispiel, und ich fand es eine sehr wertvolle Ressource sein.

Andere Tipps

"Use Ausnahmen" vs. "Use Fehlercodes" ist nie so eindeutig, wie Beispiele zeigen.

Verwenden Fehlercodes für Programmablauf. Wenn Sie einen Fehler haben, die erwartet wird, nicht eine Ausnahme werfen. Z.B. Sie eine Datei zu lesen, können Sie eine Ausnahme für werfen "Datei nicht gefunden" "Datei gesperrt" ; aber nie ein Wurf für "Ende der Datei" .

Wenn Sie das tun, können Sie nie einfache Schleifen schreiben, werden Sie immer Einwickeln Code in Exception-Handler. Und vergessen Sie nicht Ausnahmen sehr langsam sind, dies ist besonders wichtig in großem Multi-Threaded-Server. (Nicht so wichtig, überhaupt in Ihrer Desktop-Anwendung).

Zweitens, sehr vorsichtig sein mit Ausnahme Hierarchien. Sie mögen denken, es ist OK, eine Exception Klasse hat, dann ein NetException daraus ziehen, dann für Ihre SMTP-Klasse SMTPException. Aber es sei denn, Sie generische Daten in der Basisklasse halten, werden Sie immer jede Art von Ausnahme in dieser Hierarchie zu fangen. Z.B. wenn Sie den Grund für den SMTP-Fehler in Ihrer SMTPException Klasse setzen, müssen Sie ihn fangen - wenn nur Sie Exception Arten fangen, werden Sie keinen Zugriff auf die SMTPException Mitglieder haben. Eine gute Lösung für dieses Problem ist eine Zeichenfolge und ein int Mitglied in der Basisausnahmeklasse zu haben und sie nur benutzen, auch für die abgeleiteten Typen. Leider bietet std::exception nur einen String: (

Einige Leute sagen, dass dies zu tun bedeutet, dass Sie könnte genauso gut nur einen einzigen Ausnahme-Typen, vor allem, wie Sie sowieso immer die Basisklasse Art fangen.

Wenn Sie Ausnahmen tun verwenden, müssen die Mühe machen, sie mit mehr Daten zu füllen, als würden Sie mit einem Fehlercode. Mit Fehler, müssen Sie sie sofort behandeln oder sie gehen in den Code verloren. Mit einer Ausnahme kann es viele Ebene weg hängen bleiben, von wo sie geworfen wurde - wie in Roddys Beispiel. DoC genannt wird, und bekommt eine Ausnahme 2 Ebenen in von DoA. Wenn Sie nicht den Fehler angeben, um den Code in DoA um genau zu sein, können Sie denken, es von der DoB Funktion geworfen wurde. (Einfaches Beispiel, aber ich habe Code gesehen, wo eine Ausnahme viele Ebene auf dem Call-Stack behandelt wurde. Es war ein b st rd zu debuggen. Dies gilt insbesondere für OO-Programme)

So hoffnungsvoll, ich habe Ihnen genug gegeben zu denken. Die einfache Wahrheit der Sache ist, dass Stil bedeutet nichts in der Fehlerbehandlung, Praktikabilität alles ist. Wenn Sie log Aussagen haben überall einen Fehler setzen auftreten können, dann tun Sie dies. Es kommt viel mehr, dass Sie sehen können, wo der Code falsch gelaufen ist (und welche Daten wurde gearbeitet mit), als Sie eine elegante Ausnahme Hierarchie haben oder Sie haben Ihren Code mit Exception-Handler übersät. Wenn Sie nicht einfach den Fehler verfolgen, Ihr Fehlerbehandlungscode ist nutzlos.

Ausnahmen sind gut, sie verwenden. Aber denken Sie, was Sie tun, durch Missbrauch nicht oder sie überstrapazieren. Eine missbräuchlich verwendete Ausnahme ist schlimmer als gar keine Fehler bei alle Handhabung (wie Sie ein Crash-Dump greifen können und die nicht behandelte Ausnahme sehen die Fehler in Sekunden zu finden. Mit einer Ausnahme, das gegessen und ignoriert wird, sind Sie gestopft).

Ich habe im Laufe der Jahre festgestellt, dass der größte Assistent Debuggen anmeldet. Schreiben Sie Protokolle, schreiben viele Protokolle.

Ich ziehe die Ausnahmebehandlung in diesem Artikel beschrieben. Es führt zu sauberem Code und vermeidet explizite Erstellung / Löschen von Objekten nur Ausnahmen zu verarbeiten. http://www.informit.com/articles/article.aspx?p=373339

Mit C ++, Sie sollten auf jeden Fall mit weniger sichtbaren Fehlerbehandlung Code am Ende, weil Sie eine Menge schweres Heben zu Ausnahmen verlassen können.

Meiner Meinung nach der einfachste Regel mit Ausnahmen (und am häufigsten gebrochen) ist diesen. Versuchen Sie nicht, Ausnahmen zu fangen, wenn Sie einen bestimmten Plan haben, sie zu behandeln.

Mit Ausnahmen, Sie müssen nicht über Fehler-Codes von Funktionen zurück sorgen, denn gut gestaltete Funktionen werden nur statt Ausnahmen werfen.

C ein typischer Fehlerbehandlung Szenario sieht wie folgt aus:

int DoA() 
{
 if (location == hellInAHandcart)
  return ERROR;
 else
  RETURN OK;
}

int DoB()
{
  int err = DoA();
  if (err != OK)
     return err;
  else
     return DoSomethingElse1();
}

int DoC()
{
  int err = DoB();
  if (err != OK)
     //Handle My error here in whatever way...
}

Während in C ++ ...

void DoA() 
{
 if (location == hellInAHandcart)
  throw Exception("Gone To Hell in a Handcart");
}

void DoB()
{
  DoA();
  DoSomethingElse1();
}

void DoC()
{
  try
  {
    DoB();
  }
  catch (Exception &E)
  {
    // Handle My error here in whatever way...
  }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top