首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回错误码

返回错误码
EN

Stack Overflow用户
提问于 2011-04-26 02:58:03
回答 1查看 215关注 0票数 0

我的错误处理有问题...(使用VS2010Express)

我的代码如下所示:

代码语言:javascript
复制
#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),上面的代码也不是我写的。我知道发生了什么,但是"done:“和"done_err:”这些我以前从未见过的东西。如果有人能很快解释这一点,我将非常感激。

问候你,伦皮

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-04-26 03:04:38

'That done: stuff'是一个标签,goto用于执行跳转,即在同一函数中完全不同的标签位置继续程序执行。因此,在出现错误的情况下,执行将直接在显示done_err:的行下继续执行-在执行完错误报告之后,它会跳转到done:标签后面的常规返回点。

你读它有困难,我读它也有困难。每个人都有阅读它的困难。所以:

这在C++中是非常糟糕的做法。因此,除非您有非常充分的理由,否则不要使用 goto

同样的逻辑可以表达如下:

代码语言:javascript
复制
  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之前释放它)。检查代码的其余部分是否有任何缺陷,但首先要去掉那些goto。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5781970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档