Was ist der Gültigkeitsbereich des Ausnahmeobjekts in C++? Wird der Catch-Handler ausgeführt? Wenn ich ein unbenanntes Exception-Objekt erzeuge und es ausschreibe, spielt es beim Abfangen dieser Exception keine Rolle, ob ich es durch eine const-Referenz oder eine nicht-konstante Referenz abfange.Bereich des Ausnahmeobjekts in C++
Antwort
Wenn ein throw
Ausdruck ausgewertet wird, wird ein Ausnahmeobjekt aus dem Wert des Ausdrucks initialisiert. Das Exception-Objekt, das ausgelöst wird, erhält seinen Typ vom statischen Typ des throw-Ausdrucks und ignoriert alle Qualifizierer const
und volatile
. Für Klassenarten bedeutet dies, dass Kopierinitialisierung durchgeführt wird.
Der Geltungsbereich des Ausnahmeobjekts liegt außerhalb des Bereichs des Blocks, in dem der Throw auftritt. Stellen Sie sich vor, Sie leben in einem speziellen Ausnahmebereich auf einer Seite des normalen Callstacks, in dem lokale Objekte leben.
In einem catch
Block wird der Name, der mit dem gefangenen Ausnahmeobjekt initialisiert wurde, mit diesem Ausnahmeobjekt und nicht mit dem Argument throw
initialisiert, auch wenn es sich um einen Lvalue handelte.
Wenn Sie catch
über nicht-const Referenz, dann können Sie das Ausnahmeobjekt mutieren, aber nicht, was es initialisiert wurde. Sie können das Verhalten des Programms ändern, wenn Sie die Ausnahme auf eine Weise neu werfen, die nicht möglich war, wenn Sie von Wert oder const-Referenz abgefangen wurden (const_cast
s beiseite).
Das Ausnahmeobjekt wird zerstört, wenn der letzte Catch-Block, der nicht durch einen erneuten Wurf (d. H. Eine parameterlose Auswertungsauswertung) beendet wird.
Zunächst geht das Objekt, das Sie werfen, fast sofort außer Reichweite. Was von Exception-Handlern abgefangen wird, ist eine Kopie des ursprünglichen Objekts. Diese Kopie wird gelöscht, nachdem der Catch-Handler ausgeführt wurde es sei denn, Sie fangen es nach Wert (nicht per Referenz). In diesem Fall wird eine weitere Kopie erstellt. Aber Sie sollten es auf jeden Fall als Referenz (vorzugsweise const one) fangen.
Das Ausnahmeobjekt ist nur im Block catch
verfügbar. Sie können das Ausnahmeobjekt nicht außerhalb des Blocks catch
verwenden. Folgende Schritte passieren, wenn Sie eine Ausnahme und fangen werfen:
try
{
MyException anObject;
throw anObject; //1
}
catch(MyException exObject)
{
}
- Die
throw
Klausel (// 1) empfängt das lokale ObjektanObject
, und behandelt sie als Wert Argument: es eine Kopie desanObject
schafft. - Der Handler
catch
fängt ein MyException-Objekt ab, das wiederum ein Wertparameter ist. In diesem Moment wird eine weitere Kopie erstellt. - Wenn der Handler
catch
implementiert hätte, um eine Referenz auf ein Objekt(catch (MyException &o))
zu erhalten, wird die zweite Kopie vermieden. - Wenn
catch
Handler das Ausnahmeobjekt vonconst&
empfängt, können Sie nurconst
Methoden aufrufen.
- 1. Lebensdauer des Ausnahmeobjekts
- 2. SCOPE_IDENTITY in C# - Bereich
- 3. Laden Bild aus Ressourcen Bereich des Projekts in C#
- 4. C# geschützten Bereich Zugang
- 5. Bereich des globalen Arrays in Funktion
- 6. Variablen in den Bereich des Aufrufers einfügen?
- 7. Bereich des privaten Konstruktors in Nested Class
- 8. Bereich des Parameters in dynamischen Funktionsaufruf
- 9. Bereich des zweitgrößten Schlüssels in Min - Heap
- 10. C# Enumerable Bereich
- 11. C++: Zeiger und Bereich
- 12. C++ SDL - Render in einem bestimmten Bereich
- 13. Ändern des Wertes von Zellen in einem Bereich ohne Schleife
- 14. Vererbung, Bereich und Vorlage Konstruktoren in C++
- 15. Simulator/Generated Switch-Anweisung Bereich in c
- 16. Emacs Kommentar-Bereich in C-Modus
- 17. C# -Arrays Minimalwert in einem bestimmten Bereich
- 18. Bereich von Zeichenart-Werten in C
- 19. C# Datagridview mit Valuetype Bereich
- 20. Ziel c vergleichen Bereich schneidet
- 21. Struktur im Staging-Bereich des Data Warehouse
- 22. Schwarzer Bereich auf UIWebView während des Ladens
- 23. Methode 'Wert' des Objekts 'Bereich' fehlgeschlagen
- 24. C# mit Enumerable Bereich als int
- 25. DES-Verschlüsselung in C#
- 26. Wie kann ich Pixel aus einem bestimmten Bereich des Bildschirms in C# sehr schnell erhalten?
- 27. C# - Verwenden einer Variablen in einem 'umschließenden' lokalen Bereich?
- 28. Detect neu gestrichenen Bereich des Bildschirms in Java
- 29. Ändern des Wertes Bereich während der Iteration in Python
- 30. Suchwort in attributedString von Backword und bekomme Bereich Objective-C
Fragen Sie nach der * Lebenszeit *? – Joren
Ja ... wann wird es zerstört werden? – Naveen
Um Jorens Frage zu klären: Der Begriff _scope_ bezieht sich normalerweise auf die Region (Codezeilen), in der die Variable einen Namen hat.Das Wort _scope_ wird oft missbraucht, um _lifetime_ zu bedeuten, was, wie Sie verstanden haben, wie lange die Variable tatsächlich im Speicher liegt. – Thomas