Sicherstellen, dass Ausnahmen sind immer сaught

stimmen
21

Ausnahmen in C ++ müssen nicht gefangen werden (keine Kompilierung-Fehler) durch die aufrufende Funktion. Es liegt also Urteil Entwickler, ob sie try / catch mit fangen (anders als in Java).

Gibt es eine Möglichkeit sichergestellt werden kann, dass die ausgelöste Ausnahmen sind immer try / catch durch die aufrufende Funktion gefangen verwenden?

Veröffentlicht am 04/08/2008 um 11:01
quelle vom benutzer
In anderen Sprachen...                            


7 antworten

stimmen
22

Nein.

Siehe Einen pragmatischen Blick auf Exception - Spezifikationen aus Gründen , warum nicht.

Der einzige Weg, können Sie „Hilfe“ Dies ist die Ausnahmen Ihre Funktion zu dokumentieren werfen kann, sagen, wie ein Kommentar in der Header-Datei, um sie zu erklären. Dies wird nicht durch den Compiler oder etwas erzwungen. Verwenden Sie Code-Reviews zu diesem Zweck.

Beantwortet am 04/08/2008 um 11:10
quelle vom benutzer

stimmen
9

Sie sollten hier nicht mit einer Ausnahme. Dies ist natürlich nicht ein Ausnahmefall, wenn Sie es überall Sie mit dieser Funktion erwartet werden müssen!

Eine bessere Lösung wäre es, die Funktion zu erhalten, eine Instanz von so etwas wie dies zurückzukehren. Im Debug-Builds (unter der Annahme Entwickler ausüben Codepfade sie gerade geschrieben haben), werden sie zu einer Assertion, wenn sie, ob die Operation succeded oder nicht überprüfen vergessen.

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_; }
}
Beantwortet am 24/09/2008 um 10:24
quelle vom benutzer

stimmen
4

Außerhalb der Umfang Ihrer Frage so überlegte , ich nicht dieses Posting aber in Java gibt es tatsächlich zwei Arten von Ausnahmen, geprüft und ungeprüft. Der grundlegende Unterschied ist , dass, ähnlich wie in c[++], Sie nicht eine ungeprüfte Ausnahme zu fangen.

Für eine gute Referenz versuchen , diese

Beantwortet am 04/08/2008 um 18:51
quelle vom benutzer

stimmen
2

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

Allerdings bin ich über die Wurzel der Frage neugierig. Wenn der Benutzer sollte immer den Anruf in einem try / catch - Block wickeln, sollte der Benutzer genannte Funktion sein wirklich Ausnahmen in erster Linie zu werfen?

Dies ist eine schwierige Frage , ohne mehr Kontext in Bezug auf die Code-Basis in Frage zu beantworten. Schießen aus der Hüfte, ich denke , die beste Antwort hier ist die Funktion einpacken , so dass die empfohlene (wenn nicht nur in Abhängigkeit von dem Gesamt Ausnahme Stil des Codes) öffentliche Schnittstelle funktioniert die try / catch für den Benutzer. Wenn Sie nur versuchen , um sicherzustellen , dass es keine unbehandelten Ausnahmen in Ihrem Code sind, Unit - Tests und Code - Review sind wahrscheinlich die beste Lösung.

Beantwortet am 05/08/2008 um 05:56
quelle vom benutzer

stimmen
0

Es war einmal ein Versuch, fügt dynamische Ausnahme Spezifikationen zu einer Funktion Unterschrift, aber da die Sprache nicht ihre Richtigkeit erzwingen konnte, wurden sie später abgeschrieben.

In C ++ 11 und nach vorn, haben wir jetzt die noexcept Spezifizierer .
Auch hier markiert ist , wenn die Unterschrift zu werfen, gibt es noch nicht requriement , dass es durch den Anrufer behandelt werden.


Je nach Kontext, können Sie das außergewöhnliche Verhalten durch Codierung in das Typsystem gehandhabt werden gewährleisten.

Siehe: std :: optional als Teil der Bibliothek Grundlagen.

Beantwortet am 08/05/2016 um 15:07
quelle vom benutzer

stimmen
0

Gibt es eine Möglichkeit sichergestellt werden kann, dass die ausgelöste Ausnahmen sind immer try / catch durch die aufrufende Funktion gefangen verwenden?

Ich finde es ziemlich lustig, dass das Java - Publikum - darunter auch ich - überprüft Ausnahmen zu vermeiden versucht. Sie werden versuchen , ihren Weg zur Arbeit gezwungen werden , um Ausnahmen zu fangen , indem Sie Runtime .

Beantwortet am 04/08/2008 um 19:14
quelle vom benutzer

stimmen
0

Oder könnten Sie kritische Ausnahmen werfen beginnen. Sicherlich wird eine Zugriffsverletzung Ausnahme fangen die Benutzer aufmerksam.

Beantwortet am 04/08/2008 um 18:33
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more