Сущность технологии COM


Исключения - часть 2


HRESULT CreateErrorInfo([out] ICreateErrorInfo **ppcei);

В дополнение к IErrorInfo объекты исключений по умолчанию открывают интерфейс ICreateErrorInfo, чтобы позволить пользователю инициализировать состояние нового исключения:

[ object, uuid(22F03340-547D-101B-8E65-08002B2BD119) ] interface ICreateErrorInfo: IUnknown { // set IID of interface that threw exception // устанавливаем IID интерфейс, который возбудил исключение HRESULT SetGUID([in] REFGUID rGUID); // set class name of object that threw exception // устанавливаем классовое имя объекта, который возбудил исключение HRESULT SetSource([in, string] OLECHAR* pwszSource); // set human-readable description of exception // устанавливаем читабельное описание исключения HRESULT SetDescription([in, string] OLECHAR* pwszDesc); // set WinHelp filename of documentation of error // устанавливаем имя файла WinHelp, содержащего документацию об ошибке HRESULT SetHelpFile([in, string] OLECHAR* pwszHelpFile); // set WinHelp context ID for documentation of error // устанавливаем идентификатор контекста WinHelp для документации ошибки HRESULT SetHelpContext([in] DWORD dwHelpContext); }

Заметим, что этот интерфейс просто позволяет пользователю заполнить объект исключения пятью основными атрибутами, доступными из интерфейса IErrorInfo.

Следующая реализация метода выбрасывает СОМ-исключение своему вызывающему объекту, используя объект исключений по умолчанию:

STDMETHODIMP PugCat::Snore(void) { if (this->IsAsleep()) // ok to perform operation? // можно ли выполнять операцию? return this->DoSnore(); //do operation and return // выполняем операцию и возвращаемся //otherwise create an exception object // в противном случае создаем объект исключений ICreateErrorInfo *рсеi = 0; HRESULT hr = CreateErrorInfo(&pcei); assert(SUCCEEDED(hr)); // initialize the exception object // инициализируем объект исключений hr = pcei->SetGUID(IID_IPug); assert(SUCCEEDED(hr)); hr = pcei->SetSource(OLESTR("PugCat")); assert(SUCCEEDED(hr)); hr = pcei->SetDescription(OLESTR("I am not asleep!")); assert(SUCCEEDED(hr)); hr = pcei->SetHelpFile(OLESTR("C:\\PugCat.hlp")); assert(SUCCEEDED(hr)); hr = pcei->SetHelpContext(5221); assert(SUCCEEDED(hr)); // "throw" exception // "выбрасываем" исключение IErrorInfo *pei = 0; hr = pcei->QueryInterface(IID_IErrorInfo, (void**)&pei); assert(SUCCEEDED(hr)); hr = SetErrorInfo(0, pei); // release resources and return a SEVERITY_ERROR result // высвобождаем ресурсы и возвращаем результат // SEVERITY_ERROR (серьезность ошибки) pei->Release(); pcei->Release(); return PUG_E_PUGNOTASLEEP; }




Начало  Назад  Вперед



Книжный магазин