Ich kenne den Unterschied in der Handhabung dieser beiden Fänge, aber was braucht die Ellipse, um etwas zu fangen, das der std :: exception-Fang nicht fangen würde?
Beispielsweise:
try
{
throw std::runtime("runtime error!");
}
catch(const std::exception& e)
{
std::cout << "Exception: " << e;
}
catch(...)
{
std::cout << "How did I get here?";
throw;
}
Ich habe Beispiele für Code gesehen, die beide zusammen verwenden, aber ich habe keinen Grund gesehen, warum Sie beides tun würden.
4 Antworten
catch(const std::exception& e)
Erfasst nur Standardausnahmen.
catch(...)
Werde dort danach alles fangen.
Sie können Ganzzahlen und andere Typen verarbeiten (http://www.cplusplus.com/doc/tutorial) / Ausnahmen /)
Beispielsweise:
catch(int e)
Dies ist zwar auf jeden Fall eine gute Idee, Sie müssen jedoch nicht Ihre benutzerdefinierten Ausnahmen von std::exception
ableiten. Mit C ++ können Sie praktisch jeden Objekttyp werfen.
So wird throw 1;
beispielsweise nicht von Ihrem ersten Handler verarbeitet. Und keiner wird ...
class MyCustomException { // Doesn't derive
///
};
... wenn es geworfen wurde.
Sie meinten wahrscheinlich:
throw std::runtime_error("runtime error!"); // not std::runtime
Der std :: runtime_error wird vom std :: exception, sodass Ihr erster catch-Block ausgelöst wird, wenn Ausnahmen vom Typ std::exception
abgefangen werden. . Und da meintest du wahrscheinlich:
std::cout << "Exception: " << e.what(); // not e
Wenn Sie etwas anderes als std::run_time
oder std::exception
und seine Ableitungen werfen, wird der zweite catch
Block ausgelöst. Nützliches Lesen aus den C ++ - FAQ: Was soll ich werfen?
Wie geschrieben, löst die Anweisung throw
ein Objekt aus, dessen Typ von std::exception
abgeleitet ist, sodass es von der ersten catch
-Klausel abgefangen wird. Wenn Sie den Wurf in throw 3;
ändern, wird die Ausnahme von der zweiten catch
Klausel abgefangen, nicht von der ersten.
Verwandte Fragen
Neue Fragen
c++
C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entwickelt und hat eine ähnliche Syntax, ist aber jetzt eine völlig andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. Verwenden Sie ein versionsspezifisches Tag für Fragen zu einer bestimmten Standardversion [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] oder [C ++ 23] usw. .