Je nachdem, wie Sie Ihre Ausnahme-Hierarchie, Wieder Auslösen einer Ausnahme durch die Benennung der Ausnahmevariable in der throw-Anweisung angeordnet haben kann Scheibe die ursprüngliche Ausnahmeobjekt.
A no-Argument throw Ausdruck wird die aktuelle Ausnahmeobjekt Erhaltung seiner dynamischen Typ werfen, während ein throw Ausdruck mit einem Argument, wird eine neue Ausnahme auf der Grundlage der statischen Typ des Arguments throw
werfen.
z.
int main()
{
try
{
try
{
throw Derived();
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
throw b;
}
}
catch (Base& b)
{
std::cout << "Caught a reference to base\n";
b.print(std::cout);
}
return 0;
}
Wie oben geschrieben, das Programm folgende Ausgabe:
Caught a reference to base
Derived
Caught a reference to base
Base
Wenn die throw b
ersetzen ist mit einem throw
, dann wird die äußere Fang wird auch die ursprünglich geworfen Derived
Ausnahme fangen. Dies gilt immer noch, wenn die innere Klasse die Base
Ausnahme nach Wert anstatt nach Referenz abfängt - obwohl dies natürlich bedeuten würde, dass das ursprüngliche Ausnahmeobjekt nicht geändert werden kann. Daher würden sich Änderungen an b
nicht in der Derived
Ausnahme des äußeren Blocks widerspiegeln .
Ah, ich habe das Schneiden völlig vergessen! Verdammt, das ist wichtig! Danke, dass du das angesprochen hast. +1 (Obwohl ich glaube, als Sie geschrieben haben "... den ursprünglichen statischen Typ zu bewahren ..." meinten Sie _dynamic_ type. Was heißt _dynamic type_, wenn nicht der _ "original static type _ _." - – sbi
Großartig Antwort, das habe ich auch komplett vergessen. – GManNickG
Ich bin glücklich, dass jemand anderes in das _slicing_ Problem gelaufen ist;) –