在捕获异常时将有用数据转储到控制台

时间:2010-11-09 22:41:11

标签: c++ visual-studio-2008 mfc exception-handling console-application

我有一个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。我们很感激。感谢。

1 个答案:

答案 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;

关于您的代码的其他几点:

  1. 您应该确保在catch块中删除了异常对象。如果您的CExceptionHandler类继承了MFC CException,那么您应该致电ex->Delete()。如果没有,则需要delete ex

  2. 我建议不要为自己的函数使用Afx前缀 - 在我看来,您应该考虑将此保留用于MFC库。

  3. 我希望这有帮助!