На этом шаге мы рассмотрим класс _com_error.
В Visual C++ есть класс _com_error, инкапсулирующий код HRESULT и скрывающий детали работы с ним. В этом классе определены функции, возвращающие информацию о соответствующей ошибке. Самые важные приведены в таблице 1:
Функция-член | Возвращаемое значение |
---|---|
Error | Код HRESULT, на основе создан объект _com_error |
ErrorInfo | Указатель на объект IErrorInfo (описан ниже) или NULL, если объект IErrorInfo не существует. Завершив работу с объектом IErrorInfo следует вызвать его функцию Release() |
Wcode | Значение HRESULT минус 0х80040200, если используется FACILITY_ITF. В противном случае функция возвращает нуль |
ErrorMessage | Указатель типа TCHAR на системное сообщение, описывающее ошибку. Если такое сообщение отсутствует, возвращается строка "Unknown error", за которой следует шестнадцатеричный код HRESULT |
Если инкапсулированный HRESULT связан с объектом IErrorInfo, то объект _com_error получает доступ к информации об ошибке. Например, функции-члены HelpFile() и HelpContext() могут обратиться к объекту IErrorInfo и вернуть информацию об ошибке, которая затем отображается средствами справки Windows Help.
Так как объект _com_error представляет причину исключения его часто передают в блок catch. Рассмотрим пример, в котором таким образом перехватываются ошибки с кодом E_OUTOFMEMORY:
#include <comdef.h> #include <stdio.h> void main() { try { _com_error e(E_OUTOFMEMORY); //Создание объекта throw(e); //Вызов исключения } catch(_com_error& e) { printf("Error = %081x\n", e.Error()); printf("WCode = %04x\n", e.WCode()); printf("Meaning = %s\n\n", e.ErrorMessage()); } }
Результат работы этой программы таков:
Error = 8007000e WCode = 0000 Meaning = Not enough storage is available to complete this operation.
На следующем шаге мы рассмотрим доступ из приложений к кодам HRESULT.