Wenn ein Windows-Laufzeittyp einen COM-Fehler auslöst, scheint .NET diesen Fehler oft (oder immer?) Nur in eine Exception
-Instanz einzubetten. Die Fehlermeldung enthält den COM HRESULT-Fehlercode. Bei Verwendung der neuen Cryptographic API mit AES-CBC zum Beispiel führt eine falsche Pufferlänge zu einem Exception
mit der Meldung "Der angegebene Benutzerpuffer ist für die angeforderte Operation nicht gültig. (Exception from HRESULT: 0x800706F8
)".Wie behandelt man WinRT-Exceptions, die zu Exception führen?
Nun, wie sollen wir mit diesen Ausnahmen umgehen? Sollten wir den HRESULT
Code von der Ausnahme lesen, um eine Idee zu bekommen, welche Art von Ausnahme das war? In klassischen .NET würde ich eine CryptographicException
bekommen, die ich verwenden könnte, um kryptografische Fehler von anderen Fehlern zu unterscheiden.
Eine andere Sache, die ich nicht verstehe, ist, dass die Microsoft-Codequalitätsregeln angeben, dass man niemals Exception sondern immer abgeleitete Typen werfen sollte. Der Grund ist, dass niemand gezwungen sein sollte, den allgemeinen Exception
zu fangen, der auch mehr fatale Ausnahmen wie OutOfMemoryException
fängt. Eine andere Regel besagt, dass man niemals Exceptio
n in Bibliotheken fangen sollte. Wie können wir diesen Richtlinien folgen, wenn wir gezwungen sind, Exception
in Windows Store-Apps oder WinRT-Bibliotheken zu erfassen?
Übrigens: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception. Ich nehme an, Exception
ist nicht mehr schlechter Code dann.
In Bezug auf den verknüpften Blog-Eintrag können viele der aufgeführten "fatalen" Ausnahmen nicht vom verwalteten Code abgefangen werden. Insbesondere "StackOverflowException", obwohl ich mir ziemlich sicher bin, dass auch AVs nicht abgefangen werden können (beide können natürlich im nativen Code abgefangen werden, aber das ist gefährlich). Beachten Sie auch, dass einige Ausnahmen, die _fall_ fatal sind, tatsächlich nicht so sind. Zum Beispiel geben viele COM-Komponenten "E_OUTOFMEMORY" zurück, wenn der Speicherplatz in einem bestimmten Puffer erschöpft ist. Dieses HRESULT wird als OutOfMemoryException übersetzt, bedeutet jedoch nicht, dass der gesamte Adressraum des Prozesses erschöpft ist. –