Jeśli typ środowiska wykonawczego systemu Windows powoduje błąd COM .NET wydaje się często owijać ten błąd (lub zawsze?) Tylko w instancję Exception
. Komunikat o błędzie zawiera kod błędu COM HRESULT. Podczas korzystania z nowego Cryptographic API z AES-CBC na przykład niewłaściwa długość bufora powoduje, że Exception
z komunikatem "Dostarczony bufor użytkownika jest niepoprawny dla żądanej operacji (Exception from HRESULT: 0x800706F8
)".Jak obsługiwać wyjątki WinRT, które powodują wyjątek?
Cóż, jak mamy sobie poradzić z tymi wyjątkami? Czy powinniśmy przeczytać kod od HRESULT
, aby dowiedzieć się, jaki to był wyjątek? W klasycznym .NET dostałbym CryptographicException
, którego mogłem użyć do odróżnienia błędów kryptograficznych od innych błędów.
Inną rzeczą, której nie rozumiem, jest to, że zasady jakości kodu Microsoft stwierdzają, że nigdy nie należy wyrzucać typów wyjątków, ale zawsze pochodnych. Powodem jest to, że nikt nie powinien być zmuszany do złapania generalnego Exception
, który łapie więcej krytycznych wyjątków, takich jak OutOfMemoryException
. Inna zasada mówi, że nigdy nie powinno się w żadnym razie przechwytywać bibliotek. Jak możemy postępować zgodnie z tymi zasadami, jeśli jesteśmy zmuszeni złapać Exception
w aplikacjach Windows Store lub bibliotekach WinRT?
Przy okazji: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception. Zakładam, że złapanie Exception
nie jest już wtedy złym kodem.
W odniesieniu do połączonego wpisu w blogu wiele wymienionych "śmiertelnych" wyjątków nie może zostać przechwyconych przez kod zarządzany. Warto zauważyć, 'StackOverflowException', chociaż jestem prawie pewien, że AVs również nie może zostać przechwycony (oba mogą być przechwycone w natywnym kodzie, oczywiście, ale jest to niebezpieczne). Zauważ też, że niektóre wyjątki, które __wyjaśniają_, mogą nie być tak naprawdę. Na przykład wiele komponentów COM zwraca 'E_OUTOFMEMORY', gdy przestrzeń w określonym buforze jest wyczerpana. HRESULT zostanie przetłumaczony jako OutOfMemoryException, ale nie oznacza to, że proces wyczerpał całą swoją przestrzeń adresową. –