Frage

In C++ versuche ich, alle Arten von Ausnahmen in einem Catch abzufangen (z catch(Exception) in C#).Wie wird es gemacht?Und außerdem: Wie kann man Ausnahmen bei der Division durch Null abfangen?

War es hilfreich?

Lösung

catch (...)
{
   // Handle exceptions not covered.
}

Wichtige Überlegungen:

  • Ein besserer Ansatz ist bestimmte Arten von Ausnahmen zu fangen, dass Sie tatsächlich aus, im Gegensatz zu allen möglichen Ausnahmen wiederherstellen können.
  • catch (...) auch bestimmte schwere Systemebene Ausnahmen (variiert je nach Compiler) fangen, dass Sie gehen zu können, nicht verlässlich erholen aus. Fangen sie auf diese Weise und sie dann beim Schlucken und Weiterbildung könnte dazu führen, weitere ernsthafte Probleme in Ihrem Programm.
  • auf Ihrem Kontext Je kann es akzeptabel sein, fängt zu verwenden (...), sofern die Ausnahme erneut geworfen. In diesem Fall melden Sie alle nützlichen lokalen Zustandsinformationen und dann die Ausnahme erneut werfen, damit er sich vermehren. Jedoch Sie auf den RAII Muster lesen, sollten wenn Sie diesen Weg wählen.

Andere Tipps

Sie nicht will Fang werden (...) (das heißt Fang mit dem Auslassungszeichen), wenn Sie wirklich, auf jeden Fall, die meisten beweisbar einen Bedarf dafür haben.

Der Grund dafür ist, dass einige Compiler (Visual C ++ 6 die häufigsten zu nennen) auch Fehler wie Zugriffsfehler und andere wirklich schlechte Bedingungen in Ausnahmen wenden, die Sie gerne mit Fang verarbeiten können (...). Das ist sehr schlecht, weil Sie nicht über die Abstürze mehr sehen.

Und technisch gesehen, ja, können Sie auch Teilung fangen von Null (Sie müssen „Stackoverflow“ für das), aber Sie sollten wirklich solche Spaltungen in erster Linie machen werden vermieden wird.

Stattdessen wie folgt vor:

  • Wenn Sie wirklich wissen, welche Art von Ausnahme (n) zu erwarten, diese Arten zu fangen und nicht mehr, und
  • Wenn Sie Ausnahmen werfen selbst, und müssen alle Ausnahmen fangen leiten Sie werfen, machen diese Ausnahmen von std :: exception (als Adam Pierce vorgeschlagen) und fangen das.

Wenn Sie auf Fenster und müssen Fehler wie divide zu handhaben durch Null und Zugriffsverletzung können Sie eine strukturierte Ausnahme Übersetzer verwenden. Und dann innerhalb Ihrer Übersetzer können Sie eine c ++ Ausnahme werfen:

void myTranslator(unsigned code, EXCEPTION_POINTERS*)
{
    throw std::exception(<appropriate string here>);
}

_set_se_translator(myTranslator);

Beachten Sie, der Code wird Ihnen sagen, was der Fehler war. Auch müssen Sie mit der / EHa Option (C / C ++ -> Code-Generatrion -> Aktivieren C / C ++ Ausnahmen = Ja mit SEH Ausnahmen) kompilieren.

Wenn das nicht Sinn Kasse macht die Dokumentation für [_set_se_translator] ( http://msdn.microsoft.com/en-us/library/5z4bw5h5 (VS.80) .aspx)

Wenn alle Ausnahmen fangen - einschließlich OS diejenigen - wirklich ist, was Sie benötigen, müssen Sie einen Blick auf Ihre Compiler und Betriebssystem zu übernehmen. Zum Beispiel unter Windows haben Sie wahrscheinlich "__try" Stichwort oder Compiler-Schalter zu machen "try / catch" fangen SEH Ausnahmen, oder beides.

Machen Sie alle Ihre individuelle Ausnahmeklassen erben von std :: exception, dann können Sie einfach std :: exception fangen. Hier einige Beispiel-Code:

class WidgetError
    : public std::exception
{
public:
    WidgetError()
    { }

    virtual ~WidgetError() throw()
    { }

    virtual const char *what() const throw()
    {
        return "You got you a widget error!";
    }
};

In C ++ ist der Standard nicht eine Division durch Null Ausnahme definieren, und Implementierungen sind in der Regel nicht, sie werfen.

Sie können natürlich, verwenden catch (...) { /* code here */ }, aber es hängt wirklich davon ab, was Sie wollen, um Do. In C ++ haben Sie determinis Destruktoren (keine dieser Finalisierung Müll), wenn Sie also aufzuwischen wollen, zu tun, die richtige Sache ist RAII zu verwenden.

Zum Beispiel. Statt:

void myfunc()
{
    void* h = get_handle_that_must_be_released();
    try { random_func(h); }
    catch (...) { release_object(h); throw; }
    release_object(h);

}

Sie so etwas wie:

#include<boost/shared_ptr.hpp>

void my_func()
{
    boost::shared_ptr<void> h(get_handle_that_must_be_released(), release_object);
    random_func(h.get());
}

Erstellen Sie Ihre eigene Klasse mit einem destructor, wenn Sie Boost nicht verwenden.

Wenn ich mich richtig erinnere (es ist schon eine Weile her, seit ich bei C haben gesucht ++), ich denke, das folgende sollte es tun

try
{
 // some code
}
catch(...)
{
 // catch anything
}

und eine schnelle Google ( http: // www.oreillynet.com/pub/a/network/2003/05/05/cpluspocketref.html ) scheint mir richtig zu beweisen.

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