ADO COM 异常捕获不到,导致程序崩溃, 怎么办?

jasonabc1 2016-06-03 11:05:43
首先, SEH 异常全局捕获我已有, 但是未加进去, 因为 COM 异常本来就应该可以捕获的, 不知道为什么捕获不了。

代码很简单, 关掉Sqlserver 服务器, 建立下列代码

bool CSqlServerHelper::Initialize(StringData mConnection, StringData * pErrInfo, bool IsAfxOleInit)
{
// 初始化COM,创建ADO连接等操作
if (IsAfxOleInit)AfxOleInit(); //因为使用了 Html 所有已经初始了 Ole Init
// 在ADO操作中建议语句中要常用try...catch()来捕获错误信息,
// 因为它有时会经常出现一些意想不到的错误。
try
{
m_pConnection.CreateInstance(__uuidof(Connection)); // 实例化 Connection
m_pConnection->ConnectionTimeout = 30; // 超时 5 秒
// 连接 Sql Server
m_Connection = mConnection;
if (m_pConnection->Open(mConnection.GetWString().c_str(), "", "", adModeUnknown) != S_OK)
{
m_Initialize = false;
return false;
}
}
catch (_com_error *e)
{
if (pErrInfo != NULL)
pErrInfo->SetStringFormat("执行【数据库开启连接】时发生错误:%s %s %s", e->ErrorMessage(), e->Source(), e->Description());
m_Initialize = false;
return false;
}
catch (...)
{
pErrInfo->SetStringFormat("执行【数据库开启连接】时发生错误:%08x", GetLastError());
}

m_Initialize = true;
return true;
}

那么这一句是肯定不行的, 暂时先不管连接字符串的问题。
if (m_pConnection->Open(mConnection.GetWString().c_str(), "", "", adModeUnknown) != S_OK)


本来应该引发 catch(_com_error *e) 异常。 但确捕获不到。
Stack Call 如下:
Server.exe!_CxxThrowException(void * pExceptionObject, const _s__ThrowInfo * pThrowInfo) 行 157 C++
Server.exe!_com_raise_error(HRESULT hr, IErrorInfo * perrinfo) 行 19 C++
Server.exe!_com_issue_errorex(HRESULT hr, IUnknown * punk, const _GUID & riid) 行 66 + 0x10 字节 C++
Server.exe!Connection15::Open(_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Password, long Options) 行 1271 C++
> Server.exe!CSqlServerHelper::Initialize(CPublic_MFC::StringData mConnection, CPublic_MFC::StringData * pErrInfo, bool IsAfxOleInit) 行 40 + 0xbf 字节 C++

代码无问题, 本贴仅讨论异常问题。 因为服务端程序最怕的就是突然漰溃。

从Stack 上看, 异常已经抛出
在 VS 中, 中断在这里:CxxThrowException
使用 Release 编译直接执行, 程序漰溃。 怀疑与系统装了VS 或 Windbg , Ollydbg 有关, 但不确定。

请各位大神赐教。



...全文
225 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasonabc1 2016-06-09
  • 打赏
  • 举报
回复
引用 1 楼 zyq5945 的回复:
异常捕获方式写错了 catch (_com_error *e) 改成 catch (_com_error& e)
首先, 是调试器的原因, 默认调试器打开了异常中断, 所以在 Throw Error 的时候, 就自动中断了, 但由于是多线程程序, 并不能很好的中断, 而是显示调试后, 马上又得到其它异常 其次, 异常方式错了, 不是 *e 而是 &e . 估计和 Throw 的方式有关, 倒是没注意这里, 谢谢。
zyq5945 2016-06-04
  • 打赏
  • 举报
回复
异常捕获方式写错了 catch (_com_error *e) 改成 catch (_com_error& e)

4,018

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧