[英]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.