Что ж, это немного взломано, но поехали.
Первым делом нужно получить HResult
из исключения. Поскольку это защищенный член, нам нужно немного подумать, чтобы получить значение. Вот метод расширения, который поможет:
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);
}
}
Теперь в вашей области улова вы можете получить HResult
:
catch (Exception ex)
{
int hResult = ex.HResultPublic();
}
Отсюда вам нужно будет интерпретировать результат HResult. Вам понадобится эта ссылка.
Нам нужно получить ErrorCode
, который хранится в первых 16 битах значения, поэтому вот некоторая битовая операция:
int errorCode = (int)(hResult & 0x0000FFFF);
Теперь обратитесь к списку кодов системных ошибок и мы здесь:
ERROR_DISK_FULL
112 (0x70)
Так что протестируйте это, используя:
switch (errorCode)
{
case 112:
// Disk full
}
Может быть, есть какие-то функции «более высокого уровня», чтобы получить все это, но, по крайней мере, это работает.
person
ken2k
schedule
15.02.2012