1

我有一個CExceptionHandler類,只要我的應用程序檢測到運行時異常,就會調用它。例如:將有用的數據轉儲到控制檯上捕獲異常

if (val == NULL) 
{ 
    TRACE(_T("Unexpected NULL in sequence.")); 
    AfxThrowException(ERROR_INVALID_DATA); 
} 

AfxThrowException很簡單:

void AfxThrowException(DWORD error) 
{ 
    CExceptionHandler * pException = NULL; 

    if (error == 0) 
    { 
     error = ::GetLastError(); 
    } 

    pException = new CExceptionHandler(error); 

    TRACE(_T("Warning: throwing CSerialException for error %d\n"), error); 
    THROW(pException); 
} 

這是CExceptionHandler成員Dump功能:

void CExceptionHandler::Dump(CDumpContext & dc) const 
{ 
    CObject::Dump(dc); 

    dc << "m_dwError = " << m_dwError; 
} 

在我的代碼越往上我有try/catch聲明:

try 
{ 
    /* My app does stuff where the exception is thrown. */ 
} 
catch(CExceptionHandler * ex) 
{ 
    afxDump << _T("Dumping exceptional data: ") << _T("\r\n"); 
    ex->Dump(afxDump); 
    afxDump << _T("\r\n"); 
} 

我想收集的調試信息被轉儲到控制檯。但是,當PC進入catch語句(通過斷點驗證)時,控制檯上沒有任何反應。我在調試模式下使用Visual Studio 2008。感謝讚賞。謝謝。

+0

是否存在引發動態分配內存的結果? (Leaky。) – GManNickG 2010-11-09 23:00:26

+1

@GMan:你有使用「reason」而不是「result」的結果嗎? ':)'(哦,我認爲那就是MFC,但是我對此事的看法僅僅來自傳聞......) – sbi 2010-11-09 23:23:43

+0

@sbi:哈,好。 – GManNickG 2010-11-09 23:25:16

回答

3

CDumpContext將輸出發送到調試器,而不是控制檯(見OutputDebugString瞭解更多信息),如果你在Visual Studio調試器下運行,輸出將出現在輸出窗口。

如果您還希望將輸出發送到控制檯,則可以將CDumpContext配置爲通過將指針傳遞給CDumpContext constructor中的CFile對象來寫入CFile

如果您的應用程序與「使用多字節字符集」配置選項建,你可以使用CStdioFile寫入任何標準輸出或標準錯誤:

CStdioFile file(stdout); 
CDumpContext dumpContext(&file); 
ex->Dump(dumpContext); 

或者,如果你想使用afxDump,您可以直接設置其m_pFile成員變量(它的名稱爲public)。例如,你可以把這個代碼的main函數中:

CStdioFile file(stdout); 
afxDump.m_pFile = &file;  

但是,如果因爲字符串需要轉換爲多字節寫入到stdout您開發的應用爲Unicode這是不行的。做轉換,寫一個類繼承CFile

class CDumpFile : public CFile 
{ 
    public: 
     virtual void Write(const void* lpBuf, UINT nCount); 
}; 

void CDumpFile::Write(const void* lpBuf, UINT nCount) 
{ 
    // Construct string from array of wide chars 
    const wchar_t* p = static_cast<const wchar_t*>(lpBuf); 
    UINT len = nCount/sizeof(wchar_t); 
    CStringW str(p, len); 

    CStringA astr(str); // Convert wide char to multibyte 

    fputs((LPCSTR)astr, stdout); // Write multibyte string to stdout 
} 

,並使用它是這樣的:

CDumpFile file; 
afxDump.m_pFile = &file; 

一對夫婦對你的代碼的其他要點:

  1. 你應該確保catch塊中的異常對象被刪除。如果你的CExceptionHandler類繼承MFC的CException那麼你應該打電話ex->Delete()。如果沒有,則需要delete ex

  2. 我建議不要在自己的函數中使用前綴Afx - 在我看來,您應該考慮將此保留用於MFC庫。

我希望這有助於!

+0

謝謝!我使用'CDumpContext dumpContext(&file)'實現瞭解決方案,並且它大部分都可以工作。然而,它將字符分隔開('CE xception H andlerat $ 0 0 E 2 4 E 4 0 m _ dw E rror = 1 7 0'。有什麼想法導致這種情況? – 2010-11-11 16:38:21

+0

是的,這是因爲'CStdioFile'正在寫'wchar_t'字符串到控制檯,期望MBCS。看到我更新的答案。 – ChrisN 2010-11-13 12:39:18

+0

它似乎現在工作。感謝您的幫助! – 2010-11-15 19:53:56