返回错误代码

时间:2011-04-25 18:58:03

标签: c++ error-handling ado

我的错误处理有问题...(使用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;

在标有ERROR的行中,我得到一个运行时错误,调试器进入comip.h第782行。 我之前从未使用错误处理程序(ooops),上面的代码不是我写的。我知道最近发生了什么,但是我以前从未见过的“完成:”和“完成:”这些东西。如果有人能够解释我很快就会非常感激。

此致 Lumpi

1 个答案:

答案 0 :(得分:3)

'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之前没有释放它)。检查代码的其余部分是否存在任何缺陷,但首先要清除那些缺陷。