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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im Allgemeinen ist es am besten, um Ausnahmen von Wert und fangen Sie durch Referenz:
Würden Sie nur in der Lage sein zu fangen eine Ausnahme mit
catch (SomethingException*)
wenn Sie werfen es mitthrow new SomethingException()
. Gibt es nicht genug Informationen in Ihrer Frage sagen, aber das problem kann in, wieSomethingException
stammt ausstd::exception
. Überprüfen oder ändern Sie es zu Erben aus, sagen wir,std::runtime_error
oderstd::logic_error
statt.Verwenden Sie außerdem keine
throw
Planern. Einfach nicht. Kein compiler bietet jeglichen Vorteil durch die Verwendung von checked exceptions: der Effekt von überprüft Ausnahmen sind nicht geprüft außer scheitern schrecklich (werfenstd::bad_exception
) im Falle einer Ausnahme, die nicht entsprechen, die Planer. Das ist wahrscheinlich das, was passiert in Ihrem code.runtime_error
undlogic_error
Konstruktoren nehmen einenstring
Nachricht, undwhat()
müssen diethrow()
Planer, wenn Sie überladen ist.throw(SomethingException)
Bezeichner der Funktion. Es gibt wirklich keinen Grund fangen Sie eine Benutzer-definierte Ausnahme sollte nicht funktionieren, und es gibt nicht genug Informationen in Ihrem Beitrag zu sagen, wo dein problem ist.throw SomethingException();
im Hauptteil der Funktion.Für andere, die vielleicht das problem haben, wo eine benutzerdefinierte Ausnahme, abgeleitet von std::exception wird geworfen, aber nicht gefangen, überprüfen Sie auch:
- Das Erbe ist öffentlich
- Wenn Ihr Ausnahme deklariert ist in einer anderen DLL, die von der exception-Klasse aus der DLL exportiert. Seltsam, wenn es nicht ist, das nicht zu einem link-Fehler (in VS2012), es ist nur nicht erwischt.
Können Sie den code, wo Sie werfen die Ausnahme.
Weiterer Punkt ist über die throw-Spezifikationen - es ist generell eine schlechte Idee. Das problem ist, dass C++ im Gegensatz zu Java, nicht darauf bestehen, werfen-specs und so bekommt man neben keiner von Ihnen profitieren. Alles, was Sie tun können, ist möglicherweise ein core dump, wenn der code (oder code-Aufruf) wirft eine Ausnahme, die nicht angegeben ist in der werfen-spec