我的错误处理有问题...(使用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),上面的代码也不是我写的。我知道发生了什么,但是"done:“和"done_err:”这些我以前从未见过的东西。如果有人能很快解释这一点,我将非常感激。
问候你,伦皮
发布于 2011-04-26 03:04:38
'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之前释放它)。检查代码的其余部分是否有任何缺陷,但首先要去掉那些goto。
https://stackoverflow.com/questions/5781970
复制相似问题