我有一个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);
}
这是Dump
的成员CExceptionHandler
功能:
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 :(得分:3)
CDumpContext
将输出发送到调试器,而不是控制台(有关详细信息,请参阅OutputDebugString
),如果在Visual Studio调试器下运行,输出将显示在输出中窗口。
如果您还想将输出发送到控制台,可以通过将指针传递给CDumpContext
constructor中的CDumpContext
对象来配置CFile
以写入CFile
。 。
如果您的应用程序是使用“使用多字节字符集”配置选项构建的,则可以使用CStdioFile
写入stdout或stderr:
CStdioFile file(stdout);
CDumpContext dumpContext(&file);
ex->Dump(dumpContext);
或者,如果您想使用afxDump
,您可以直接设置其m_pFile
成员变量(它声明为public
)。例如,您可以将此代码放在main
函数中:
CStdioFile file(stdout);
afxDump.m_pFile = &file;
但是,如果您的应用程序是作为Unicode构建的,那么这将无效,因为字符串需要转换为多字节才能写入stdout。要进行转换,请编写一个继承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;
关于您的代码的其他几点:
您应该确保在catch
块中删除了异常对象。如果您的CExceptionHandler
类继承了MFC CException
,那么您应该致电ex->Delete()
。如果没有,则需要delete ex
。
我建议不要为自己的函数使用Afx
前缀 - 在我看来,您应该考虑将此保留用于MFC库。
我希望这有帮助!