2014-07-23 49 views
0

考慮下一段代碼:
MFC CDatabase :: OpenEx函數如何知道它在try/catch塊中?

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

執行Connect()之後 - 如果連接字符串包含錯誤的數據,然後用錯誤描述一個消息框將被顯示。

現在,如果我換行調用Connect()在try/catch塊沒有消息框會顯示出來,而不是將引發異常:

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

現在,我不知道如何OpenEx()的理解是,被try/catch塊封裝,並且不需要顯示帶有錯誤描述的消息框。我知道它與某些在OpenEx()(TRY,CATCH_ALL等)中使用的MFC特定宏以及它們提供的AFX_EXCEPTION_LINK結構有關,但仍然無法獲得整個圖像。

謝謝。

+1

您捕獲併吞下該錯誤。 MessageBox可能由頂級捕獲顯示。 – quantdev

+0

@quantdev是的,看起來你是對的,奇怪的是我沒有考慮到頂級水平。請把你的評論寫成問題,我會接受。 – Apokal

回答

1

它不知道它。

您的catch確實吞下了您的程序中拋出的頂級catch的異常(在添加try/catch之前)。這個最高級的捕獲是顯示錯誤消息的對話框。