Freigeben über


Auslösen von Softwareausnahmen

Einige der häufigsten Programmfehlerquellen werden vom System nicht als Ausnahmen gekennzeichnet. Wenn Sie beispielsweise versuchen, einen Speicherblock zu belegen, jedoch unzureichend Arbeitsspeicher vorhanden ist, löst die Laufzeit oder API-Funktion keine Ausnahme aus, sondern gibt einen Fehlercode zurück.

Sie können jedoch jede Bedingung als Ausnahme behandeln, indem Sie diese Bedingung in Ihrem Code erkennen und dann melden, indem Sie die RaiseException-Funktion aufrufen. Indem Sie Fehler auf diese Weise kennzeichnen, können Sie die Vorteile der strukturierten Ausnahmebehandlung für jede Art von Laufzeitfehler nutzen.

So verwenden Sie die strukturierte Ausnahmebehandlung bei Fehlern

  • Definieren Sie einen eigenen Ausnahmecode für das Ereignis.

  • Rufen Sie auf RaiseException , wenn Sie ein Problem erkennen.

  • Verwenden Sie Ausnahmebehandlungsfilter, um den von Ihnen definierten Ausnahmecode zu testen.

Die <Datei "winerror.h> " zeigt das Format für Ausnahmecodes an. Um sicherzustellen, dass Sie keinen Code definieren, der in Konflikt mit einem vorhandenen Ausnahmecode steht, legen Sie das dritte höchstwertige Bit auf 1 fest. Die vier höchstwertigen Bits sollten so festgelegt werden, wie in der folgenden Tabelle gezeigt.

Bits Empfohlene Binäreinstellung Beschreibung
31-30 11 Diese zwei Bits beschreiben den grundlegenden Status des Codes: 11 = Fehler, 00 = Erfolg, 01 = Information, 10 = Warnung.
29 1 Clientbit. Wird für benutzerdefinierten Code auf 1 festgelegt.
28 0 Reservierte Bitzahl. (Festlegung auf 0 beibehalten.)

Sie können die ersten zwei Bits optional auf eine andere Einstellung als binär 11 festlegen, obwohl die Einstellung "Fehler" für die meisten Ausnahmen angemessen ist. Es ist wichtig, daran zu denken, Bits 29 und 28 so festzulegen, wie es in der vorherigen Tabelle gezeigt wurde.

Der resultierende Fehlercode sollte daher die höchsten vier Bits auf hexadezimales E festlegen. Die folgenden Definitionen definieren beispielsweise Ausnahmecodes, die keine Konflikte mit Windows-Ausnahmecodes verursachen. (Sie müssen jedoch prüfen, welche Codes von Drittanbieter-DLLs verwendet werden).

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

Nachdem Sie einen Ausnahmecode definiert haben, können Sie ihn verwenden, um eine Ausnahme auszulösen. Der folgende Code löst beispielsweise die STATUS_INSUFFICIENT_MEM Ausnahme als Reaktion auf ein Speicherzuweisungsproblem aus:

lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
    RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);

Wenn Sie einfach eine Ausnahme auslösen möchten, können Sie die letzten drei Parameter auf 0 festlegen. Die drei letzten Parameter übergeben zusätzliche Informationen und legen Flags fest, die Handler beim Fortsetzen der Ausführung hindern. Weitere Informationen finden Sie in der RaiseException-Funktion im Windows SDK.

In den Ausnahmebehandlungsfiltern können Sie dann die Codes testen, die Sie definiert haben. Beispiel:

__try {
    ...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
        GetExceptionCode() == STATUS_FILE_BAD_FORMAT )

Siehe auch

Schreiben eines Ausnahmehandlers
Strukturierte Ausnahmebehandlung (C/C++)