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.

6
felix1415 17 Apr. 2018 im 15:19

4 Antworten

Beste Antwort
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)
3
felix1415 17 Apr. 2018 im 12:23

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.

3
StoryTeller - Unslander Monica 17 Apr. 2018 im 12:22

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?

2
Ron 17 Apr. 2018 im 12:49

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.

0
Pete Becker 17 Apr. 2018 im 12:22