Frage

Ausnahmen in C++ müssen von der aufrufenden Funktion nicht abgefangen werden (keine Fehler bei der Kompilierung).Es liegt also im Ermessen des Entwicklers, ob er sie mit try/catch abfängt (im Gegensatz zu Java).

Gibt es eine Möglichkeit sicherzustellen, dass die ausgelösten Ausnahmen immer mit try/catch von der aufrufenden Funktion abgefangen werden?

War es hilfreich?

Lösung

NEIN.

Sehen Ein pragmatischer Blick auf Ausnahmespezifikationen aus Gründen, warum nicht.

Die einzige Möglichkeit, dies zu „helfen“, besteht darin, die Ausnahmen zu dokumentieren, die Ihre Funktion auslösen kann, beispielsweise als Kommentar in der Header-Datei, die sie deklariert.Dies wird nicht vom Compiler oder irgendetwas erzwungen.Verwenden Sie zu diesem Zweck Codeüberprüfungen.

Andere Tipps

Sie sollten hier keine Ausnahme verwenden.Dies ist natürlich kein Ausnahmefall, wenn Sie damit überall rechnen müssen, wo Sie diese Funktion verwenden!

Eine bessere Lösung wäre, die Funktion dazu zu bringen, eine Instanz von so etwas zurückzugeben.In Debug-Builds (vorausgesetzt, Entwickler führen Codepfade aus, die sie gerade geschrieben haben) erhalten sie eine Bestätigung, wenn sie vergessen, zu überprüfen, ob der Vorgang erfolgreich war oder nicht.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}

Da Ihre Frage außerhalb des Rahmens liegt, habe ich darüber nachgedacht, dies nicht zu posten, aber in Java gibt es tatsächlich zwei Arten von Ausnahmen: aktivierte und deaktivierte.Der grundlegende Unterschied besteht darin, dass, ähnlich wie in c[++], müssen Sie keine ungeprüfte Ausnahme abfangen.

Für eine gute Referenz Versuche dies

Chris' hat wahrscheinlich die beste reine Antwort auf die Frage:

Ich bin jedoch neugierig auf den Kern der Frage.Wenn der Benutzer sollte stets Wenn Sie den Aufruf in einen Try/Catch-Block einschließen, sollte die vom Benutzer aufgerufene Funktion überhaupt Ausnahmen auslösen?

Diese Frage ist ohne weiteren Kontext zur betreffenden Codebasis schwer zu beantworten.Wenn ich aus der Hüfte schaue, denke ich, dass die beste Antwort hier darin besteht, die Funktion so einzupacken, dass die empfohlene öffentliche Schnittstelle (wenn nicht nur, abhängig vom Gesamtausnahmestil des Codes) den Try/Catch übernimmt für der Benutzer.Wenn Sie nur sicherstellen möchten, dass Ihr Code keine unbehandelten Ausnahmen enthält, sind Komponententests und Codeüberprüfung wahrscheinlich die beste Lösung.

Gibt es eine Möglichkeit, wie man sicherstellen kann, dass die geworfenen Ausnahmen immer mit Try/Fang von der Aufruffunktion erwischt werden?

Ich finde es ziemlich lustig, dass die Java-Menge - inklusive mir - versucht, aktivierte Ausnahmen zu vermeiden.Sie versuchen zu umgehen, dass sie gezwungen werden, Ausnahmen abzufangen, indem sie verwenden Laufzeitausnahmen.

Es gab einmal den Versuch, etwas hinzuzufügen dynamische Ausnahmespezifikationen zur Signatur einer Funktion, aber da die Sprache ihre Genauigkeit nicht durchsetzen konnte, wurden sie später abgewertet.

In C++11 und höher haben wir jetzt das noException-Spezifizierer.
Auch hier gilt: Wenn die Signatur zum Auslösen markiert ist, ist es immer noch nicht erforderlich, dass sie vom Aufrufer verarbeitet wird.


Abhängig vom Kontext können Sie sicherstellen, dass außergewöhnliches Verhalten behandelt wird, indem Sie es in das Typsystem codieren.

Sehen: std::optional als Teil der Bibliotheksgrundlagen.

Oder Sie könnten anfangen, kritische Ausnahmen auszulösen.Sicherlich wird es eine Zugriffsverletzungsausnahme geben fangen die Aufmerksamkeit Ihrer Benutzer.

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