Problem werfen und fangen benutzerdefinierte Ausnahmen in C++

Habe ich die Klasse Something, die eine exception wirft SomethingException (SomethingException erbt von std::exception), wenn es nicht zu instanziieren. das problem ist, ich kann nicht fangen SomethingException als solche (ich musste ein schmutziger trick, um ihn zu fangen).

Gibt es irgendwo im Programm, wo es ausführt:
Dies nicht funktioniert, wird die Ausnahme nicht abgefangen wird und das Programm stürzt ab.

try{
    Something* s = new Something();
}
catch (SomethingException* e){
    std::cerr<<e.what();
}

In Kontrast hat Arbeit (Ausnahme abgefangen ist und die richtige Meldung angezeigt), aber ich habe wirklich das Gefühl ich sollte nicht dabei sein

try{
    Something* s = new Something();
}
catch (std::exception* e){
    SomethingException* e2 = (SomethingException*) e;
    std::cerr<<e.what();
}

Da der Zeiger wird gecastet, ich kann nur diese Arbeit machen, wenn und nur wenn eine Art von exception geworfen wird. Der moment, den ich brauchen, um verschiedene Arten dies nicht funktioniert.

Gibt es eine Möglichkeit, fing eine benutzerdefinierte Ausnahme in einer mehr richtige Weg?

Edit:

Ausnahme geworfen wird wie folgt

//...
throw new SomethingException ("Errormessage"); //Custom exception constructor
//...

Die Erklärung von Etwas::Etwas() ist

Something::Something() throw(...)

Mit der Erklärung

Something::Something() throw(SomethingException)
//or
Something::Something() throw(SomethingException*)

Wirft viele Warnungen (Warnung C4290)

  • Warum sind Sie werfen Sie einen Zeiger statt mit Wert?
  • Ihr code fühlt sich an wie ein Java-Programmierer beginnen in C++. Die Art und Weise der Anwendung von Ausnahmen ist nicht die übliche C++ Weg.
  • Hinweis: Es ist einfacher, die Ableitung Ausnahmen von std::runtime_error als std::exception. Dies ist, weil std::runtime_error speichern die Fehlermeldung (übergeben im Konstruktor) für Sie, der zurückgegeben wird, durch das, was () - Methode. Hinweis: MSVC hat ein nicht-standard std::exception, können Sie übergeben die Fehlermeldung im Konstruktor.
InformationsquelleAutor NeonMan | 2011-06-12
Schreibe einen Kommentar