вернуть код ошибки - PullRequest
       3

вернуть код ошибки

0 голосов
/ 25 апреля 2011

У меня проблема с обработкой ошибок ... (с использованием VS2010Express)

Мой код выглядит так:

#import "C:\Program\Delade filer\System\ado\msado15.dll" rename ("EOF","adoEOF") no_namespace


int main(int argc, char *argv[])
{

    _ConnectionPtr  pConnection;
    _CommandPtr     pCommand;
    _ParameterPtr   pParameter;
    _RecordsetPtr   pRecordset;
    int iErrorCode;
    HRESULT hr;

    //      Initialize COM  
    if(FAILED(hr = CoInitialize(NULL)))
    {
            goto done_err;
    }

    // more code here .....    

    //      Uninitialize COM        
    CoUninitialize();

    // Everything worked out, report an OK
    iErrorCode = 0;

        done:
        return iErrorCode;     ERROR!!
        done_err:
    // TODO: Cleanup
        iErrorCode = (int)hr;
        goto done;

В строке, помеченной как ОШИБКА, я получаю ошибку времени выполненияи отладчик переходит в строку comip.h 782. Я никогда раньше не использовал процедуры обработки ошибок (ooops), и приведенный выше код не написан мной.Я понимаю, что происходит, но вещи "done:" и "done_err:" я никогда раньше не видел.Если бы кто-нибудь мог объяснить это в ближайшее время, я был бы очень благодарен.

С уважением, Lumpi

1 Ответ

3 голосов
/ 25 апреля 2011

'That done: stuff' - это метка , а goto используется для выполнения прыжка , то есть продолжения выполнения программы в совершенно другом месте с меткой в ​​пределах той же функции. Таким образом, в случае ошибки выполнение продолжается непосредственно под строкой, которая гласит done_err: - после создания отчета об ошибке он переходит к обычной точке возврата, которая находится за меткой done:.

У вас проблемы с чтением, у меня проблемы с чтением. У всех есть проблемы с чтением. Итак:

Это очень плохая практика в C ++. Поэтому не используйте goto , если у вас нет веских причин.

Та же логика может быть выражена следующим образом:

  if(FAILED(hr = CoInitialize(NULL)))
  {
        // HandleError could display a messagebox or print to a log file ...
        HandleError(hr); 
        return hr;
  }

  // do something meaningful

  return 0;

Что касается вашего крушения - мы очень мало можем с этим поделать. Скорее всего, вы где-то вызываете какое-то повреждение данных (моя догадка, я никогда не использовал этот материал ADO самостоятельно: вы теряете дескриптор соединения, то есть вы не освобождаете его до вызова CoUnitialize). Проверьте оставшуюся часть кода на наличие недостатков, но сначала избавьтесь от этих ошибок.

...