C'est un peu compliqué, mais c'est parti.
La première chose à faire est d'obtenir le HResult
de l'exception. Comme il s'agit d'un membre protégé, nous avons besoin d'un peu de réflexion pour obtenir la valeur. Voici une méthode d'extension qui fera l'affaire :
public static class ExceptionExtensions
{
public static int HResultPublic(this Exception exception)
{
var hResult = exception.GetType().GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance).Where(z => z.Name.Equals("HResult")).First();
return (int)hResult.GetValue(exception, null);
}
}
Maintenant, dans votre portée de capture, vous pouvez obtenir la HResult
:
catch (Exception ex)
{
int hResult = ex.HResultPublic();
}
A partir de là, vous devrez interpréter le HResult. Vous aurez besoin de ce lien .
Nous devons obtenir le ErrorCode
qui est stocké dans les 16 premiers bits de la valeur, donc voici quelques opérations sur les bits :
int errorCode = (int)(hResult & 0x0000FFFF);
Maintenant, référez-vous à la liste des codes d'erreur du système et nous y voilà :
ERROR_DISK_FULL
112 (0x70)
Alors testez-le en utilisant :
switch (errorCode)
{
case 112:
// Disk full
}
Il existe peut-être des fonctions de "niveau supérieur" pour obtenir tout cela, mais au moins cela fonctionne.