簡體   English   中英

試圖在MFC的CString :: Format中捕獲異常

[英]Trying to catch exception in MFC's CString::Format

我正在使用一個C ++項目(不是我的作者),該項目具有許多MFC字符串格式化功能。 不幸的是,諸如%d%s類的東西非常接近(包括字母d和s在鍵盤上的位置),一個可以與另一個換位。 因此,我有時可能會看到這樣的代碼行:

CString s;
s.Format(L"Value v=%s", 100);    //Should've been %d instead

這會導致過程的嚴重崩潰,很難在最終項目中定位和隔離。 所以我在考慮將Format函數包裝在我自己的重寫中,並捕獲異常並在將其記錄為未處理的異常之前對其進行記錄。

因此,我采用了以下構造:

__try
{
    //Do the Format function here
}
__except(1)
{
    //Log the error, etc.
}

但是不幸的是,上面的構造沒有從第一個代碼塊中捕獲異常,因此我加入了VS 2008 C ++調試器並顯示了此代碼:

在此處輸入圖片說明

然后我嘗試了這個:

try
{
    //Do the Format function here
}
catch(int e)
{
    //Do the logging
}

但這也沒有抓住。

那么我該如何捕捉到這個錯誤呢?

PS。 我還有第二個問題。 有沒有簡單的方法可以覆蓋MFC函數,例如Format

MFC拋出CException指針,因此您可以嘗試以下操作:

try
{
    // Do the Format function here
}
catch(CException* e)
{
    // Do the logging then free the exception
    if (m_bThrowExceptionAgain)
        throw; // Do not delete e 
    else 
        e->Delete();
}

捕獲異常對象后,您必須刪除它,如示例所示。 還要確保在編譯器中啟用了C ++異常。 有關更多信息,請參見http://msdn.microsoft.com/zh-cn/library/0e5twxsh.aspx

正如其他人已經說過的那樣,低級異常(如訪問沖突)與C ++異常不同。 它們屬於術語“ 結構化異常處理” ,並且至少在默認情況下,將需要其他方式進行捕獲。

可以更改編譯器設置(至少在Visual Studio中),以使其將那些異常包裝到C ++ try / catch語句可以處理的內容中,但是正如我記得的那樣,這丟失了SEH異常的含義以及其來源的詳細信息。

您可能會以一種或另一種方式使異常正常運行,以幫助跟蹤這些問題,但是還有另一種方式:使用靜態代碼分析。

盡管標准的C ++編譯器通常不會驗證格式/ printf樣式的調用,但可以使用多種工具。 實際上,Visual Studio的某些最新版本/版本附帶了代碼分析工具 ,盡管您提到的VS 2008中可能沒有提供該工具 因此,可能值得您進行一些研究,看看您是否擁有某種代碼分析工具,然后可以在分析/編譯時而不是運行時捕獲所有CString :: Format錯誤。

您可以使用_set_se_translator()來SEH異常轉換像訪問沖突C ++異常,然后可以趕上與except()

一些示例代碼: http : //www.codeproject.com/Articles/422/SEH-and-C-Exceptions-catch-all-in-one

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM