代码原来的实现是
try
{
InvokeHelper(...)
}
catch(...)
{
GetLastError();
}
好吧,引发了异常,但是GetLastError()永远为零。
状况了,网上又找不到相关资料。
知道自己一步一步地从InvokeHelper跟踪进去。
发现里面有这样的代码
COleDispatchException* pException =
new COleDispatchException(NULL, 0, excepInfo.wCode);
ASSERT(pException->m_wCode == excepInfo.wCode);
if (excepInfo.bstrSource != NULL)
{
pException->m_strSource = excepInfo.bstrSource;
SysFreeString(excepInfo.bstrSource);
}
if (excepInfo.bstrDescription != NULL)
{
pException->m_strDescription = excepInfo.bstrDescription;
SysFreeString(excepInfo.bstrDescription);
}
if (excepInfo.bstrHelpFile != NULL)
{
pException->m_strHelpFile = excepInfo.bstrHelpFile;
SysFreeString(excepInfo.bstrHelpFile);
}
pException->m_dwHelpContext = excepInfo.dwHelpContext;
pException->m_scError = excepInfo.scode;
// then throw the exception
THROW(pException);
最后THROW(pException);把相关的异常代码抛出来了,当然也在这段代码中LastError变成0了。
知道原因,改代码就简单了:
try
{
InvokeHelper(...)
}
catch (COleDispatchException* pException)
{
CString strErrorMsg;
pException->GetErrorMessage(strErrorMsg.GetBuffer(256), 256);
strErrorMsg.ReleaseBuffer();
AfxMessageBox(strErrorMsg);
}
总结:不同的异常最好先有不同的catch()处理,最后才catch(...)