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.
Allerdings können Sie jede Bedingung als Ausnahme behandeln, indem Sie die Bedingung in Ihrem Code ermitteln und dann durch Aufruf der Funktion RaiseException melden. 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 RaiseException auf, wenn Sie ein Problem feststellen.
Verwenden Sie Ausnahmebehandlungsfilter, um den von Ihnen definierten Ausnahmecode zu testen.
Die Datei "WINERROR.H" enthält das Format für Ausnahmecodes. 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.
Das Fehlercodeergebnis sollte daher die vier höchsten Bits auf hexadezimales E festgelegt haben. Die folgenden Definitionen definieren beispielsweise Ausnahmecodes, die mit keinen Windows-Ausnahmecodes in Konflikt stehen. (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. Zum Beispiel löst der folgende Code die STATUS_INSUFFICIENT_MEM-Ausnahme als Reaktion auf ein Problem mit der Speicherbelegung 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 unter der RaiseException-Funktion in 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 )