首页 > 代码库 > SEH and C++ Exceptions,自定义CSeException

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:

技术分享

 

 

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

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

SEH and C++ Exceptions,自定义CSeException