Frage

Was wichtige Punkte zu strukturierten Ausnahmen sollten alle C ++ Entwickler Know?

War es hilfreich?

Lösung

Sie sind die Win32 äquivalent zu Unix-Signale, und lassen Sie die CPU-Ausnahmen wie Zugriffsverletzung, illegale Anweisung, Division durch Null fangen.

Mit den richtigen Compiler-Optionen (/ EHa für Visual C ++), C ++ Ausnahmen verwenden den gleichen Mechanismus wie Stapel ordnungsgemäß funktioniert sowohl für C ++ (Benutzer) Ausnahmen und SEH (OS) Ausnahmen Abwickeln.

Im Gegensatz zu C ++ Ausnahmen sind SEH nicht getippt, aber alle die gleiche Datenstruktur, die einen Ausnahmecode hat (die Ursache) und zusätzliche Informationen darüber, was Code bemängelte und was das CPU-Register zu dem Zeitpunkt des Fehlers statt. Siehe GetExceptionCode und GetExceptionInformation für weitere Details zu diesem Thema.

Auch hat SEH "First-Chance" Handling, die Sie oder anderweitig behandeln die Ausnahme protokollieren können vor Abwickeln zerstört alle lokalen Variablen.

Andere Tipps

Vor kurzem hatte ich ein Problem, das indirekt von SEH verursacht wurde, und zwar wegen einer Eigenschaft von SEH, die ich jeder Entwickler denken sollte bewusst sein:

Wenn SEH verwendet Destruktoren nicht aufgerufen werden, wenn Sie also in Ihrem destructor Bereinigungscode haben es nicht gereinigt werden.

Unser Problem durch einen kritischen Abschnitt verursacht wurde, die von einem Objekt mit Schloss im Konstruktor und Unlock im destructor eingewickelt wurde.

Wir hatten eine Deadlock-Situation und konnte nicht herausfinden, warum, und nach etwa einer Woche der Graben durch den Code und Deponien und Debuggen wir endlich verstanden es war, weil es eine Ausnahme war, die von COM und verursacht den kritischen Abschnitt behandelt wurde bleiben gesperrt. Wir änderten eine Compilation Flag in VS in den Projekteigenschaften, die sie sagen, Destruktoren auch für SEH laufen, und dass das Problem gelöst.

Auch wenn Sie also SEH nicht in Ihrem Code verwenden können, können Sie eine Bibliothek verwenden, der (wie COM) tut, und das kann zu unerwartetem Verhalten führen.

Sie sollten wissen, dass sie nicht Teil der Standard C ++ sind -. Sie sind Erfindung Microsoft und können in anderen Sprachen als C ++ verwendet werden

Ein Crash-Kurs auf die Tiefen des Win32 ™ Structured Exception Handling

Dieser Artikel ist die Verweis auf mit SEH zu beschleunigen bekommen. 13 Jahre später, ist immer noch das Beste, was es ist.

Es ist ein spezielles Thema auf MSDN für SEH vs. C ++ Ausnahmebehandlung Unterschiede .

Einige Dinge, die ein C ++ Entwickler wissen sollten, wenn SEH diskutiert wird:

Schreiben C / C ++ SEH Exception Handlers :

__try 
{
   // guarded code
}
__except ( expression )
{
   // exception handler code
}

Dies ist nicht C ++ Ausnahmebehandlung ist die spezifischen Erweiterungen MS für gerade inot SEH Einhaken. Es funktioniert ganz anders als Ihre run-of-the-mill C ++ Ausnahmen. Sie brauchen einen guten von SEH verstehen diese zu verwenden.

Schreiben C / C ++ SEH Termination Handlers :

__try {
   // guarded code
}
__finally ( expression ) {
   // termination code
}

Das gleiche wie mit den SEH-Handler, nicht zu verwechseln diese mit C ++ Ausnahme Semantik. Sie müssen ein gutes Verständnis von SEH.

_set_se_trasnlator : Dies ist die Funktion, die SEH Ausnahmen in C ++ Typ Ausnahmen, wenn asynchrone Ausnahmen werden verwendet / EHa .

Und schließlich eine persönliche Meinung: Sollte ein C ++ Entwickler Know SEH? Nach dem ersten Rookie .ecxr Sie werden verstehen, dass, wenn der Push kommt C ++ Ausnahmen sind nur eine Illusion vorgesehen für Ihre Bequemlichkeit zu schieben. Das einzige, was los ist SEH.

Ein wichtiger Punkt ist, zu wissen, wenn SEH zu verwenden, und wenn Standard-C ++ Ausnahmen zu verwenden. Wählen Sie zunächst nur ein System - Mischsysteme neigt problematisch, ein tiefes Verständnis für beide erfordern gut umzusetzen. Zweitens auf einem hohen Niveau, ist SEH nicht auf C ++ beschränkt, während Standard-C ++ Ausnahmen sind auf Windows beschränkt. Ist dies nicht Ihre Entscheidung nicht diktieren, wählen Sie Standard-Ausnahmen, wenn sie unzureichend sind (die anderen Antworten für weitere Details sehen, was SEH tun können).

Ein Zitat von

scroll top