⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 seexception.cpp

📁 版本更新了一下
💻 CPP
字号:
// SeException.cpp

// This code was contributed by Martin Ziacek (Martin.Ziacek@swh.sk) and was
// found from http://www.codeguru.com/

// From http://www.codeguru.com/submission_guide.shtml :
//
// "While we are talking about copyrights, you retain copyright of
//  your article and code but by submitting it to CodeGuru you give it
//  permission to use it in a fair manner and also permit all developers
//  to freely use the code in their own applications - even if they are
//  commercial."

#include "stdafx.h"
#include "SeException.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

#undef THIS_FILE
static char THIS_FILE[] = __FILE__;

#define CASE(nSeCode,CsString) case EXCEPTION_##nSeCode: \
                                        CsString.Format(_T("Exception %s (0x%.8x) at address 0x%.8x."),_T(#nSeCode),EXCEPTION_##nSeCode,m_pExcPointers->ExceptionRecord->ExceptionAddress); \
                                        break;

void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
{
    throw new CSeException(nSeCode,pExcPointers);
}

IMPLEMENT_DYNAMIC(CSeException,CException)

CSeException::CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)
{
    m_nSeCode       = nSeCode;
    m_pExcPointers  = pExcPointers;
}

CSeException::CSeException(CSeException & CseExc)
{
    m_nSeCode       = CseExc.m_nSeCode;
    m_pExcPointers  = CseExc.m_pExcPointers;
}

UINT CSeException::GetSeCode()
{
    return m_nSeCode;
}

_EXCEPTION_POINTERS* CSeException::GetSePointers()
{
    return m_pExcPointers;
}

PVOID CSeException::GetExceptionAddress()
{
    return m_pExcPointers->ExceptionRecord->ExceptionAddress;
}

void CSeException::Delete(void)
{
#ifdef _DEBUG
    m_bReadyForDelete = TRUE;
#endif
    delete this;
}

int CSeException::ReportError(UINT nType/* = MB_OK*/, UINT nIDHelp/* = 0*/)
{
    int     rc;
    CString strMessage;

    GetErrorMessage(strMessage);
    rc = AfxMessageBox(strMessage,nType,nIDHelp);

    return rc;
}

BOOL CSeException::GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext/* = NULL*/)
{
    BOOL rc = TRUE;

    if (pnHelpContext != NULL)
        *pnHelpContext = 0;

    switch (m_nSeCode)
    {
    CASE(ACCESS_VIOLATION,          CsErrDescr);
    CASE(DATATYPE_MISALIGNMENT,     CsErrDescr);
    CASE(BREAKPOINT,                CsErrDescr);
    CASE(SINGLE_STEP,               CsErrDescr);
    CASE(ARRAY_BOUNDS_EXCEEDED,     CsErrDescr);
    CASE(FLT_DENORMAL_OPERAND,      CsErrDescr);
    CASE(FLT_DIVIDE_BY_ZERO,        CsErrDescr);
    CASE(FLT_INEXACT_RESULT,        CsErrDescr);
    CASE(FLT_INVALID_OPERATION,     CsErrDescr);
    CASE(FLT_OVERFLOW,              CsErrDescr);
    CASE(FLT_STACK_CHECK,           CsErrDescr);
    CASE(FLT_UNDERFLOW,             CsErrDescr);
    CASE(INT_DIVIDE_BY_ZERO,        CsErrDescr);
    CASE(INT_OVERFLOW,              CsErrDescr);
    CASE(PRIV_INSTRUCTION,          CsErrDescr);
    CASE(IN_PAGE_ERROR,             CsErrDescr);
    CASE(ILLEGAL_INSTRUCTION,       CsErrDescr);
    CASE(NONCONTINUABLE_EXCEPTION,  CsErrDescr);
    CASE(STACK_OVERFLOW,            CsErrDescr);
    CASE(INVALID_DISPOSITION,       CsErrDescr);
    CASE(GUARD_PAGE,                CsErrDescr);
    CASE(INVALID_HANDLE,            CsErrDescr);
    default:
        CsErrDescr  = _T("Unknown exception.");
        rc          = FALSE;
        break;
    }

    return rc;
}

BOOL CSeException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext/* = NULL*/)
{
    ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));

    if (pnHelpContext != NULL)
        *pnHelpContext = 0;

    CString strMessage;
    GetErrorMessage(strMessage);

    if ((UINT)strMessage.GetLength() >= nMaxError)
    {
        lpszError[0] = 0;
        return FALSE;
    }
    else
    {
        lstrcpyn(lpszError, strMessage, nMaxError);
        return TRUE;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -