Bir Windows çalışma zamanı türü bir COM hatası ortaya çıkarırsa. NET bu hatayı sık sık (veya her zaman?) Bir Exception
örneğine sığacak gibi görünüyor. Hata iletisi COM HRESULT hata kodunu içerir. Yeni Kriptografik API'yi AES-CBC ile kullanırken, örneğin bir yanlış arabellek uzunluğu, "Sağlanan kullanıcı arabelleği, istenen işlem için geçerli değil." (Exception from HRESULT: 0x800706F8
) "mesajıyla birlikte bir Exception
sonucunu verir.İstisna ile sonuçlanan WinRT istisnaları nasıl ele alınır?
Eh, nasıl bu istisnalar işlemek gerekiyor? Ne tür bir istisna olduğunu öğrenmek için istisnadan HRESULT
kodunu okur muyuz? Klasik .NET'te, kriptografik hataları diğer hatalardan ayırt etmek için kullanabileceğim bir CryptographicException
alırdım. Anlamadığım
Başka bir şey Microsoft kod kalite kuralları bir gerektiği ifade olmasıdır asla atış İstisna ama her zaman türetilmiş türleri. Bunun nedeni, hiç kimse OutOfMemoryException
gibi daha ölümcül istisnaları yakalayan genel Exception
'u yakalamaya zorlanmamalıdır. Başka bir kural da, kütüphanelerde asla asla Exceptio
n yakalanmaması gerektiğini söylüyor. Windows Mağazası uygulamalarında veya WinRT kitaplıklarında Exception
yakalamak zorunda kalırsak bu politikaları nasıl izleyebiliriz? Bu arada
: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception. Exception
'un artık kötü bir kod olmadığını anlıyorum.
, listelenen "ölümcül" istisnalar birçok yönetilen kod tarafından yakalandı edilemez. Özellikle, 'StackOverflowException', ancak AV'lerin de yakalanamayacağı konusunda kesin olarak eminim (her ikisi de tabii ki yerel koda yakalanabilir, ancak bunu yapmak tehlikelidir). Ayrıca, _appear_ ölümcül bazı istisnalar aslında olmayabilir. Örneğin, belirli bir arabellekteki boşluk bittiğinde, birçok COM bileşeni 'E_OUTOFMEMORY' döndürür. Bu HRESULT bir OutOfMemoryException olarak çevrilecektir, ancak sürecin tüm adres alanını tükettiği anlamına gelmez. –