Gibt es eine Ausnahme, die catch (...) verarbeiten kann, während catch (exception & ex) nicht kann?

7

Ich habe viel nach den Unterschieden zwischen diesen beiden Arten von Handlern gesucht, aber jeder hat gesagt, dass catch(...) ein generischer Handler ist, der alles abfängt.

Ich konnte keine Ausnahme finden, die einer von ihnen verarbeiten kann und die andere nicht. Wenn Sie sogar durch Null teilen, wird eine Ausnahme erzeugt, die beide nicht verarbeiten können (Gleitkommaausnahme).

Kann jemand mir eine Probe geben und ihren Unterschied klar erklären? Welchen von denen sollte ich verwenden?

    
JGC 12.07.2016, 07:11
quelle

4 Antworten

7
  

Gibt es eine Ausnahme, die catch(...) verarbeiten kann, während catch(exception& ex) nicht kann?

Ja, jede Ausnahme, die nicht oder nicht von std::exception abgeleitet ist, wird nicht von catch(exception&) abgefangen. Beispielsweise; throw 42; wird von catch(...) abgefangen, nicht jedoch von catch(exception&) .

A throw exception(); kann von beiden gefangen werden; Der erste Handler wird ausgewählt. Der catch(...) sollte der letzte Handler sein.

  

Sogar die Division durch Null erzeugt eine Ausnahme, die beide nicht verarbeiten können (Gleitkommaausnahme) ...

Visual Studio verfügt über zwei Modi für die Ausnahmebehandlung. synchron ( /EHsc ) und asynchron ( /EHa ). Für die synchrone Behandlung werden sowohl catch(...) als auch catch(exception&) nur C ++ - Ausnahmen abfangen; d. h. diejenigen, die mit throw xyz; geworfen wurden. Bei der asynchronen Behandlung können Zugriffsverletzungen usw. mit catch(...) abgefangen werden.

VS bietet auch eine Funktion _set_se_translator() , mit der "übersetzt" oder "übersetzt" werden kann Behandeln Sie die Win32-Ausnahmen. In der Regel wird die Funktion verwendet, um die Win32-Ausnahme in eine C ++ - Ausnahme (abgeleitet von exception ) zu übersetzen, die von catch(exception&) behandelt werden kann.

Ein Beispiel dafür, wie die Übersetzung aussehen könnte (einige Details werden aus Platzgründen weggelassen);

%Vor%
  

Welche von denen soll ich verwenden?

Sie sollten den verwenden, mit dem Sie etwas tun können. Wenn alle Ausnahmen zu derselben Behandlung in Ihrem Code führen, verwenden Sie catch(...) . Wenn Ihr Code die Ausnahmen getrennt verarbeiten muss, sollten Sie für jede erwartete Ausnahme einen Handler haben.

    
Niall 12.07.2016, 07:40
quelle
5

Sicher, jede Ausnahme eines Typs, der nicht std::exception als Basisklasse hat, wird nicht von catch(std::exception& ex) abgefangen.

Zum Beispiel

struct foo {};

throw foo();

wird von catch (...) und nicht von std::exception abgefangen.

    
Bathsheba 12.07.2016 07:12
quelle
5

Du kannst so ziemlich alles werfen (z. B. int ), und catch(...) fängt alles auf. catch(exception&) fängt nur exception oder abgeleitete Typen ab.

    
juanchopanza 12.07.2016 07:13
quelle
3

catch(...){} fängt alle Ausnahmen ab. catch(std::exception& ex){} fängt alle Ausnahmen mit std::exception als Basisklasse ab.

Ссылка

    
paweldac 12.07.2016 07:13
quelle

Tags und Links