Эффективный способ обработки ошибок, связанных с COM (C ++) - PullRequest
1 голос
/ 15 января 2009

Эффективный способ обработки ошибок, связанных с COM, в C ++ .

Например:

 switch (HRESULT_CODE(hresult)) {
    case NOERROR:
                cout << "Object instantiated and "
                "pointer to interface IS8Simulation " 
                "obtained" << endl;
        break;
    //Specifed Class not registered
    case REGDB_E_CLASSNOTREG:
        cerr << "Specified Class not registered." << endl;
        exit (EXIT_FAILURE);
        break;
    case CLASS_E_NOAGGREGATION:
                cerr << "The Class does not support aggregation "
                "(or class object is remote)." << endl;
        exit (EXIT_FAILURE);
        break;
    //Interface not supported - exit with error
    case E_NOINTERFACE:
        cerr << "No such interface supported." << endl;
        exit (EXIT_FAILURE);
        break;
    case E_UNEXPECTED:
    default:
        cerr << "Catastrophic failure." << endl;
        exit (EXIT_FAILURE);
        break;
 }

По сравнению с прежним :

if (SUCCEEDED(hresult))
{
            cout << "The COM library was initialised"
            " successfully on this thread" << endl;
} else {
            cerr << "Fatal Error: COM library was not"
            " initialised" << endl;
    exit (EXIT_FAILURE);
}

Вопрос:

  • Любой другой метод более применим?

Привет

1 Ответ

4 голосов
/ 15 января 2009

Используйте FormatMessage , чтобы получить текст ошибки - он уже знает, как искать локализованный текст для большинства кодов HRESULT и Win32.

Используйте макросы FAILED и SUCCEEDED, чтобы определить, сработало ли что-то или нет.

exit принимает 32-битные числа. Вы можете использовать HRESULT в качестве кода завершения процесса:

HRESULT hr;
if (FAILED(hr = p->QueryInterface(...)))
{
    cerr << MessageFromHResult(hr); // left as an exercise for the reader
    exit(hr);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...