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?
Gibt es eine Ausnahme, die
catch(...)
verarbeiten kann, währendcatch(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.
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.