try-except-Anweisung Anweisung
Microsoft-spezifisch
Die folgende Syntax beschreibt eine TRY-ausgenommen Anweisung:
__try
{
// guarded code
}
__except ( expression )
{
// exception handler code
}
Hinweise
Die try-except-Anweisung ist eine Microsoft-Erweiterung zu den Programmiersprachen C und C++, die Ziel-Anwendungen Steuerelement ermöglicht abzurufen, wenn Ereignisse, die normalerweise Programmausführung anhalten, auftreten.Diese Ereignisse werden Ausnahmen und den Mechanismus aufgerufen, die Abkommen Ausnahmen mit strukturierten Ausnahmebehandlung aufgerufen wird.
Weitere Informationen finden Sie unter TRY--abschließend Statement.
Ausnahmen können entweder hardwarebasiert oder softwarebasiert sein.Auch wenn Anwendungen nicht von Hardware- oder Software-Ausnahmen sich vollständig selbst beheben können, können strukturierte Ausnahmebehandlung kann abgefangen und Fehlerinformationen Anzeigen der interne Zustand der Anwendung zu erleichtern, das Problem zu diagnostizieren.Dies ist besonders nützlich für periodische Probleme, die nicht leicht reproduziert werden können.
Hinweis |
---|
Strukturierte Ausnahmebehandlung arbeitet mit Win32 für C- und C++-Quelldateien.Es ist daher nicht speziell für C++ entwickelt.Sie können sicherstellen, dass der Code portabler ist, indem Sie die C++-Ausnahmebehandlung verwenden.Auch die C++-Ausnahmebehandlung ist, flexibler, dass sie Ausnahmen eines beliebigen Typs behandeln kann.Für C++-Programme wird empfohlen, dass Sie den Mechanismus zur C++-Ausnahmebehandlungs (Versuchen Sie, Wurf und catch-Anweisungen). |
Die Verbundanweisung nach der __try-Klausel ist der Text bzw. der abgesicherte Abschnitt.Die Verbundanweisung nach der __except-Klausel ist der Ausnahmehandler.Der Handler zeigt einen Satz von Aktionen durchgeführt werden soll, wenn eine Ausnahme während der Ausführung des Texts im abgesicherten Abschnitts ausgelöst wird.Die Ausführung wird fortgesetzt, wie folgt:
Der abgesicherte Abschnitt wird ausgeführt.
Wenn keine Ausnahme, die während der Ausführung des Abschnitts als abgesicherter auftritt, wird die Ausführung bei der Anweisung nach der __except-Klausel fort.
Wenn während der Ausführung eine Ausnahme auftritt oder als abgesicherter des Abschnitts in jeder Routine der abgesicherte Abschnitt aufruft, wird der __except Ausdruck (so genannte den Filterausdruck ) ausgewertet, und der Wert bestimmt, wie die Ausnahme verarbeitet wird.Es gibt drei Werte:
**EXCEPTION_CONTINUE_EXECUTION (– 1)**Ausnahme ist geschlossen.Fortsetzen der Ausführung an der Stelle fortgesetzt, an der die Ausnahme aufgetreten ist.
EXCEPTION_CONTINUE_SEARCH (0) Ausnahme wurde nicht erkannt.Fahren Sie fort, um entlang der Aufrufliste für einen Handler, try-except zuerst zum enthaltenden von Anweisungen, für Handler mit folgender höchsten Priorität zu suchen.
EXCEPTION_EXECUTE_HANDLER (1) Ausnahme wurde erkannt.Steuerung der Ausnahmehandler, indem sie die __except Verbundanweisung dann die Ausführung ausgeführt wird, nachdem der __except-Block fortgesetzt.
Da derExcept Wechselstrom-Ausdruck als Ausdruck ausgewertet wird, wird er zu einem Einzelwert, um Operator des bedingten Ausdrucks oder den Operator Komma beschränkt.Wenn das erweiterte Verarbeitung erforderlich ist, kann der Ausdruck eine Routine aufrufen, die einen der drei Werte zurückgibt, die oben aufgelistet sind.
Jede Anwendung kann einen eigenen Ausnahmehandler haben.
Es ist nicht zulässig, in __try eine Anweisung zu springen, sondern aus einer herauszuspringen gültig.Der Ausnahmehandler wird nicht aufgerufen, wenn ein Prozess noch das Ausführen einer try-except-Anweisung beendet wurde.
Weitere Informationen finden Sie im Knowledge Base-Artikel Q315937: Gewusst wie: Blockierstapelüberlauf in einer Visual C++-Anwendung.
Das Schlüsselwort __leave
Das __leave-Schlüsselwort ist nur im abgesicherten - Abschnitts einer try-except-Anweisung gültig, und der Effekt ist, als abgesicherter an das Ende des Abschnitts zu wechseln.Die Ausführung wird mit der ersten Anweisung nach dem Ausnahmehandler fort.
Eine goto-Anweisung kann auch im abgesicherten Abschnitt herausspringen und nicht beeinträchtigt die Leistung, wie sie in einer try-finally-Anweisung ausführt, da Stapelentladung nicht auftritt.Es empfiehlt sich jedoch, dass Sie das __leave-Schlüsselwort statt einer goto-Anweisung verwenden, da weniger wahrscheinlich ein Programmierelement, Fehler zu machen, wenn der abgesicherte Abschnitt groß oder komplex ist.
Systeminterne Funktionen der strukturierten Ausnahmebehandlung
Strukturierte Ausnahmebehandlung bietet zwei systeminterne Funktionen, die verfügbar sind, mit der try-except-Anweisung verwenden: GetExceptionCode und GetExceptionInformation.
GetExceptionCode gibt den Code (eine 32-Bit-Ganzzahl) der Ausnahme zurück.
Die systeminterne Funktion GetExceptionInformation gibt einen Zeiger auf eine Struktur zurück, der zusätzliche Informationen über die Ausnahme enthält.Durch diesen Zeiger können Sie den Computer zugreifen, der Zustand zum Zeitpunkt einer Hardware- ausnahme vorhanden war.Die Struktur lautet wie folgt:
struct _EXCEPTION_POINTERS {
EXCEPTION_RECORD *ExceptionRecord,
CONTEXT *ContextRecord }
Das Zeigertypen __undEXCEPTION_RECORDCONTEXT werden in der Includedatei definiert. EXCPT.H.
Sie können GetExceptionCode innerhalb des Ausnahmehandlers verwenden.Sie können jedoch GetExceptionInformation nur innerhalb des Ausnahme filterausdrucks verwenden.Die Informationen, die sie verweist, sind in der Regel auf dem Stapel und sind nicht mehr verfügbar, wenn die Steuerung an den Ausnahmehandler übertragen wird.
Die systeminterne Funktion AbnormalTermination befindet sich innerhalb eines Beendigungshandlers verfügbar.Sie gibt 0 zurück, wenn der Text der try-finally-Anweisung nacheinander beendet wird.In allen anderen Fällen gibt es 1 zurück.
EXCPT.H definiert mehrere alternative Namen für diese systeminternen Komponenten:
GetExceptionCode entspricht dem _exception_code entsprechend
GetExceptionInformation entspricht dem _exception_information entsprechend
AbnormalTermination entspricht dem _abnormal_termination entsprechend
Beispiel
// exceptions_try_except_Statement.cpp
// Example of try-except and try-finally statements
#include <stdio.h>
#include <windows.h> // for EXCEPTION_ACCESS_VIOLATION
#include <excpt.h>
int filter(unsigned int code, struct _EXCEPTION_POINTERS *ep) {
puts("in filter.");
if (code == EXCEPTION_ACCESS_VIOLATION) {
puts("caught AV as expected.");
return EXCEPTION_EXECUTE_HANDLER;
}
else {
puts("didn't catch AV, unexpected.");
return EXCEPTION_CONTINUE_SEARCH;
};
}
int main()
{
int* p = 0x00000000; // pointer to NULL
puts("hello");
__try{
puts("in try");
__try{
puts("in try");
*p = 13; // causes an access violation exception;
}__finally{
puts("in finally. termination: ");
puts(AbnormalTermination() ? " \tabnormal" : "\tnormal");
}
}__except(filter(GetExceptionCode(), GetExceptionInformation())){
puts("in except");
}
puts("world");
}
Output
hello
in try
in try
in filter.
caught AV as expected.
in finally. termination:
abnormal
in except
world
Microsoft ENDES bestimmten
Siehe auch
Referenz
Schreiben eines Ausnahmehandlers