mfccdatabase::OpenEx函数如何知道它在try/catch块中

How does MFC CDatabase::OpenEx function knows it is in try/catch block?

本文关键字:try 块中 catch 何知道 OpenEx 函数 mfccdatabase      更新时间:2023-10-16

考虑下一段代码:

void CMyDB::Connect()
{
    //db_ is an member object of CDatabase class
    //connStr is previously defined connection string
    db_.OpenEx(connStr, CDatabase::noOdbcDialog);
}

执行Connect()后——如果连接字符串包含错误的数据,则显示错误描述的消息框。

现在,如果我在try/catch块中包装对Connect()的调用,将不会显示消息框,而是抛出一个异常:

void CMyDB::Connect()
{
    try {
        result = db_.OpenEx(connStr, CDatabase::noOdbcDialog);
    }
    catch(CDBException* e) { }
}

现在,我不明白OpenEx()是如何理解它被try/catch块包装的,没有必要显示带有错误描述的消息框。我知道它在某种程度上与OpenEx()内使用的MFC特定宏(TRY, CATCH_ALL等)和它们提供的AFX_EXCEPTION_LINK结构有关,但仍然无法获得全貌。

谢谢。

它不知道。

您的catch确实吞下了异常,该异常是(在您添加try/catch之前)抛出到程序中的顶级捕获中。