zoukankan      html  css  js  c++  java
  • SEH and C++ Exceptions,自定义CSeException

    Description of CSeException

    CSeException class is based on CException class provided by MFC. I overwrite some of useful methods, but it is working same way like any other exception class based on CException class - you can find description in documentation provided by Visual C++.

    By Martin Ziacek 

    Source Files :

    [cpp] view plain copy
     
     print?
    1. //////////////////////////////////////////////////////////////////////////  
    2. // SeException.h    By Martin Ziacek  
    3.   
    4. #ifndef __SEEXCEPTION_H__  
    5. #define __SEEXCEPTION_H__  
    6.   
    7. class CSeException : public CException  
    8. {  
    9.     DECLARE_DYNAMIC(CSeException)  
    10. public:      
    11.     CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);  
    12.     CSeException(CSeException & CseExc);  
    13.       
    14.     _EXCEPTION_POINTERS* GetSePointers(void);  
    15.     PVOID GetExceptionAddress(void);  
    16.   
    17.     UINT GetSeCode(void);  
    18.     void Delete(void);  
    19.     int  ReportError(UINT nType = MB_OK, UINT nIDHelp = 0);  
    20.     BOOL GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext = NULL);  
    21.     BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);  
    22. private:  
    23.     UINT                    m_nSeCode;  
    24.     _EXCEPTION_POINTERS*    m_pExcPointers;  
    25. };  
    26.   
    27. void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers);  
    28.   
    29. #endif //__SEEXCEPTION_H__  
    [cpp] view plain copy
     
     print?
    1. //////////////////////////////////////////////////////////////////////////  
    2. // SeException.cpp  By Martin Ziacek  
    3.   
    4. #include "stdafx.h"  
    5. #include "SeException.h"  
    6.   
    7. #ifdef _DEBUG  
    8. #define new DEBUG_NEW  
    9. #endif  
    10.   
    11. #undef THIS_FILE  
    12. static char THIS_FILE[] = __FILE__;  
    13.   
    14. #define CASE(nSeCode,CsString) case EXCEPTION_##nSeCode: /  
    15.                                         CsString.Format(_T("Exception %s (0x%.8x) at address 0x%.8x."),_T(#nSeCode),EXCEPTION_##nSeCode,m_pExcPointers->ExceptionRecord->ExceptionAddress); /  
    16.                                         break;  
    17.   
    18. void SeTranslator(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)  
    19. {  
    20.     throw new CSeException(nSeCode,pExcPointers);  
    21. }  
    22.   
    23. IMPLEMENT_DYNAMIC(CSeException,CException)  
    24.   
    25. CSeException::CSeException(UINT nSeCode, _EXCEPTION_POINTERS* pExcPointers)  
    26. {   
    27.     m_nSeCode = nSeCode;  
    28.     m_pExcPointers = pExcPointers;  
    29. }  
    30.   
    31. CSeException::CSeException(CSeException & CseExc)  
    32. {  
    33.     m_nSeCode = CseExc.m_nSeCode;  
    34.     m_pExcPointers = CseExc.m_pExcPointers;  
    35. }  
    36.   
    37. UINT CSeException::GetSeCode()  
    38. {  
    39.     return m_nSeCode;  
    40. }  
    41.   
    42. _EXCEPTION_POINTERS* CSeException::GetSePointers()  
    43. {  
    44.     return m_pExcPointers;  
    45. }  
    46.   
    47. PVOID CSeException::GetExceptionAddress()  
    48. {  
    49.     return m_pExcPointers->ExceptionRecord->ExceptionAddress;  
    50. }  
    51.   
    52. void CSeException::Delete(void)  
    53. {  
    54. #ifdef _DEBUG  
    55.     m_bReadyForDelete = TRUE;  
    56. #endif  
    57.     delete this;  
    58. }  
    59.   
    60. int CSeException::ReportError(UINT nType/* = MB_OK*/, UINT nIDHelp/* = 0*/)  
    61. {  
    62.     int rc;  
    63.     CString strMessage;  
    64.   
    65.     GetErrorMessage(strMessage);  
    66.     rc = AfxMessageBox(strMessage,nType,nIDHelp);  
    67.       
    68.     return rc;  
    69. }  
    70.   
    71. BOOL CSeException::GetErrorMessage(CString & CsErrDescr, PUINT pnHelpContext/* = NULL*/)  
    72. {  
    73.     BOOL rc = TRUE;  
    74.   
    75.     if (pnHelpContext != NULL)  
    76.         *pnHelpContext = 0;  
    77.   
    78.     switch (m_nSeCode)    {     
    79.         CASE(ACCESS_VIOLATION,CsErrDescr);  
    80.         CASE(DATATYPE_MISALIGNMENT,CsErrDescr);  
    81.         CASE(BREAKPOINT,CsErrDescr);  
    82.         CASE(SINGLE_STEP,CsErrDescr);  
    83.         CASE(ARRAY_BOUNDS_EXCEEDED,CsErrDescr);  
    84.         CASE(FLT_DENORMAL_OPERAND,CsErrDescr);  
    85.         CASE(FLT_DIVIDE_BY_ZERO,CsErrDescr);  
    86.         CASE(FLT_INEXACT_RESULT,CsErrDescr);  
    87.         CASE(FLT_INVALID_OPERATION,CsErrDescr);  
    88.         CASE(FLT_OVERFLOW,CsErrDescr);  
    89.         CASE(FLT_STACK_CHECK,CsErrDescr);  
    90.         CASE(FLT_UNDERFLOW,CsErrDescr);  
    91.         CASE(INT_DIVIDE_BY_ZERO,CsErrDescr);  
    92.         CASE(INT_OVERFLOW,CsErrDescr);  
    93.         CASE(PRIV_INSTRUCTION,CsErrDescr);  
    94.         CASE(IN_PAGE_ERROR,CsErrDescr);  
    95.         CASE(ILLEGAL_INSTRUCTION,CsErrDescr);  
    96.         CASE(NONCONTINUABLE_EXCEPTION,CsErrDescr);  
    97.         CASE(STACK_OVERFLOW,CsErrDescr);  
    98.         CASE(INVALID_DISPOSITION,CsErrDescr);  
    99.         CASE(GUARD_PAGE,CsErrDescr);  
    100.         CASE(INVALID_HANDLE,CsErrDescr);  
    101.     default:  
    102.         CsErrDescr = _T("Unknown exception.");  
    103.         rc = FALSE;  
    104.         break;  
    105.     }  
    106.   
    107.     return rc;  
    108. }  
    109.   
    110. BOOL CSeException::GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext/* = NULL*/)  
    111. {  
    112.     ASSERT(lpszError != NULL && AfxIsValidString(lpszError, nMaxError));  
    113.   
    114.     if (pnHelpContext != NULL)  
    115.         *pnHelpContext = 0;  
    116.   
    117.     CString strMessage;  
    118.     GetErrorMessage(strMessage);  
    119.   
    120.     if ((UINT)strMessage.GetLength() >= nMaxError) {  
    121.         lpszError[0] = 0;  
    122.         return FALSE;  
    123.     } else {  
    124.         lstrcpyn(lpszError, strMessage, nMaxError);  
    125.         return TRUE;  
    126.     }  
    127. }  

    Demo Project:

    [cpp] view plain copy
     
     print?
    1. void CSehDemoDlg::OnBtnCreateException()   
    2. {  
    3.     char *p = NULL;  
    4.     try   
    5.     {  
    6.         p[0] = 0;  
    7.     }   
    8.     catch(CSeException *e)   
    9.     {  
    10.         TCHAR trcMsg[1024];  
    11.         e->GetErrorMessage(trcMsg,1024);  
    12.         TRACE(trcMsg);  
    13.         TRACE(_T("/n"));  
    14.         e->ReportError(MB_OK | MB_ICONSTOP);  
    15.         e->Delete();  
    16.     }     
    17. }  

    The Result:

    SEH

    From: http://www.codeproject.com/KB/cpp/seexception.aspx

    http://blog.csdn.net/wangningyu/article/details/4579127

  • 相关阅读:
    类和对象
    关联查询
    重点函数
    三大范式
    主外键
    软件开发的项目周期
    什么是事务
    索引
    视图
    数据库对象
  • 原文地址:https://www.cnblogs.com/findumars/p/5928699.html
Copyright © 2011-2022 走看看