Si un tipo de tiempo de ejecución de Windows provoca un error COM .NET parece envolver este error a menudo (¿o siempre?) Solo en una instancia Exception
. El mensaje de error incluye el código de error COM HRESULT. Al utilizar la nueva API criptográfica con AES-CBC, por ejemplo, una longitud de búfer incorrecta da como resultado un Exception
con el mensaje "El búfer de usuario proporcionado no es válido para la operación solicitada. (Exception from HRESULT: 0x800706F8
)".¿Cómo manejar las excepciones de WinRT que resultan en Excepción?
Bueno, ¿cómo se supone que debemos manejar esas excepciones? ¿Deberíamos leer el código HRESULT
de la excepción para tener una idea del tipo de excepción que fue? En .NET clásico obtendría un CryptographicException
que podría utilizar para distinguir los errores criptográficos de otros errores.
Otra cosa que no entiendo es que las reglas de calidad del código de Microsoft indican que uno nunca debe arrojar Excepción, sino siempre los tipos derivados. La razón es que nadie debería verse obligado a detectar el Exception
general que también captura más excepciones fatales como OutOfMemoryException
. Otra regla dice que nunca se debe capturar Exceptio
n en las bibliotecas. ¿Cómo podríamos seguir estas políticas si nos vemos obligados a atrapar Exception
en las aplicaciones de la Tienda Windows o en las bibliotecas WinRT?
Por cierto: Clemens Vasters shows in his blog how we can catch Exception while avoiding to catch fatal exception. Supongo que capturar Exception
ya no es un código malo.
Con respecto a la entrada del blog vinculado, muchas de las excepciones "fatales" enumeradas no pueden ser detectadas por el código administrado. Notablemente, 'StackOverflowException', aunque estoy bastante seguro de que los AV no pueden ser capturados tampoco (ambos pueden ser capturados en código nativo, por supuesto, pero hacerlo es peligroso). Tenga en cuenta también que algunas excepciones que _parecen_ fatales pueden no serlo de hecho. Por ejemplo, muchos componentes COM devuelven 'E_OUTOFMEMORY' cuando se agota el espacio en un búfer en particular. Este HRESULT se traducirá como OutOfMemoryException, pero no significa que el proceso haya agotado todo su espacio de direcciones. –