Подтвердить что ты не робот

Копирование кода ошибки COMException

Я надеюсь, что кто-то может мне помочь. У меня есть конкретное исключение из COM, которое мне нужно поймать, а затем попытаться сделать что-то еще, все остальные должны быть проигнорированы. Мое сообщение об ошибке с Исключением:

System.Runtime.InteropServices.COMException(0x800A03EC): Microsoft Office Excel не может получить доступ к файлу "C:\test.xls". Существует несколько возможных причин:

Итак, моя первоначальная попытка была

try
{
 // something
}
catch (COMException ce)
{
   if (ce.ErrorCode == 0x800A03EC)
   {
      // try something else 
   }
}

Однако затем я прочитал предупреждение компилятора:

Предупреждение 22 Сравнение с интегралом константа бесполезна; константа вне диапазона типа 'int'..... ExcelReader.cs 629 21

Теперь я знаю, что 0x800A03EC - это HResult и я только что посмотрел MSDN и читайте:

HRESULT - это 32-битное значение, разделен на три разных поля: код серьезности, код объекта и код ошибки. Код серьезности указывает, будет ли возвращаемое значение представляет информацию, предупреждение или ошибка. Код объекта идентифицирует область системы, отвечающей за ошибка.

Итак, мой последний вопрос, как я могу обеспечить, чтобы я улавливал это конкретное исключение? Или как получить код ошибки из HResult?

Спасибо заранее.

4b9b3361

Ответ 1

ErrorCode должен быть целым числом без знака; вы можете выполнить сравнение следующим образом:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode == 0x800A03EC) {
        // try something else 
    }
}

Ответ 2

Значение HRESULT имеет 32 бита, разделенные на три поля: код серьезности, код объекта и код ошибки. Код серьезности указывает, представляет ли возвращаемое значение информацию, предупреждение или ошибку. код объекта идентифицирует область системы, ответственную за ошибку. Код - это уникальный номер, назначенный для представления исключения. Каждое исключение отображается на отдельный HRESULT. Выдержка из: http://en.wikipedia.org/wiki/HRESULT

Из того, что я собираю, первая половина бит HRESULT может измениться в зависимости от системы/процесса, вызывающего исключение. Вторая половина содержит тип ошибки.

Код должен выглядеть так:

try {
    // something
} catch (COMException ce) {
    if ((uint)ce.ErrorCode & 0x0000FFFF == 0x800A03EC) {
        // try something else 
    }
}

ПРИМЕЧАНИЕ. Пожалуйста, имейте в виду, что я не парень .NET, поэтому утомляйтесь ошибками синтаксиса в приведенном выше коде.

Ответ 3

Мне действительно удалось запустить его в системе, в которой я нуждался, и нашел код ошибки: -2146807284.

Глядя на это, если я конвертирую 0x800A03EC в двоичный файл, тогда рассмотрим его как 2 комплимента, затем вы можете вычислить значение.