结构化异常处理和C++的异常处理区别

原创 2008年09月28日 17:54:00

Windows异常由系统内核代码捕获,然后传递至用户层,多用于非法内存访问、指令错误等,其类型是CPU定义的,参见《X386保护模式编程》。
C++异常是C++编译器生成的结构(多在堆栈上),是普通的用户层代码,异常类型由用户自定义。
由于Windows异常处理和C++异常处理均使用堆栈展开,在局部堆栈的使用中存在冲突,一般不能混用。

__try{} __finally{}不会检查类内析构以及构造等操作
但是try() catch()不会存在这样的问题但是C++编译器上的所以异常类型需要你自己定义。

 

__try
 {
      ......
 }
 __except (EXCEPTION_EXECUTE_HANDLER)
 {
  wprintf(GetExceptionDescribe(GetExceptionCode()));
 }

 

 

#pragma once

typedef struct tagExcpCode
{
 DWORD dwCode;
 LPTSTR lpDescribe;
}EXCPCODE,*PEXCPCODE;


EXCPCODE g_excp_table[]=
{
 EXCEPTION_ACCESS_VIOLATION,
 _T("The thread attempts to read from or write to a virtual address for which it does not have access."),

 EXCEPTION_ARRAY_BOUNDS_EXCEEDED,
 _T("The thread attempts to access an array element that is out of bounds, and the underlying hardware supports bounds checking."),

 EXCEPTION_BREAKPOINT,
 _T("A breakpoint is encountered."),

 EXCEPTION_DATATYPE_MISALIGNMENT,
 _T("The thread attempts to read or write data that is misaligned on hardware that does not provide alignment. For example, 16-bit values must be aligned on 2-byte boundaries, 32-bit values on 4-byte boundaries, and so on."),

 EXCEPTION_FLT_DENORMAL_OPERAND,
 _T("One of the operands in a floating point operation is denormal. A denormal value is one that is too small to represent as a standard floating point value."),

 EXCEPTION_FLT_DIVIDE_BY_ZERO,
 _T("The thread attempts to divide a floating point value by a floating point divisor of 0 (zero)."),

 EXCEPTION_FLT_INEXACT_RESULT,
 _T("The result of a floating point operation cannot be represented exactly as a decimal fraction."),

 EXCEPTION_FLT_INVALID_OPERATION,
 _T("A floatin point exception that is not included in this list."),

 EXCEPTION_FLT_OVERFLOW,
 _T("The exponent of a floating point operation is greater than the magnitude allowed by the corresponding type."),

 EXCEPTION_FLT_STACK_CHECK,
 _T("The stack has overflowed or underflowed, because of a floating point operation."),

 EXCEPTION_FLT_UNDERFLOW,
 _T("The exponent of a floating point operation is less than the magnitude allowed by the corresponding type."),

 EXCEPTION_GUARD_PAGE,
 _T("The thread accessed memory allocated with the PAGE_GUARD modifier."),

 EXCEPTION_ILLEGAL_INSTRUCTION,
 _T("The thread tries to execute an invalid instruction."),

 EXCEPTION_IN_PAGE_ERROR,
 _T("The thread tries to access a page that is not present, and the system is unable to load the page. For example, this exception might occur if a network connection is lost while running a program over a network."),

 EXCEPTION_INT_DIVIDE_BY_ZERO,
 _T("The thread attempts to divide an integer value by an integer divisor of 0 (zero)."),

 EXCEPTION_INT_OVERFLOW,
 _T("The result of an integer operation causes a carry out of the most significant bit of the result."),

 EXCEPTION_INVALID_DISPOSITION,
 _T("An exception handler returns an invalid disposition to the exception dispatcher. Programmers using a high-level language such as C should never encounter this exception."),

 EXCEPTION_INVALID_HANDLE,
 _T("The thread used a handle to a kernel object that was invalid (probably because it had been closed.)"),

 EXCEPTION_NONCONTINUABLE_EXCEPTION,
 _T("The thread attempts to continue execution after a non-continuable exception occurs."),

 EXCEPTION_PRIV_INSTRUCTION,
 _T("The thread attempts to execute an instruction with an operation that is not allowed in the current computer mode."),

 EXCEPTION_SINGLE_STEP,
 _T("A trace trap or other single instruction mechanism signals that one instruction is executed."),

 EXCEPTION_STACK_OVERFLOW,
 _T("The thread uses up its stack."),

};
int g_excp_tableCount = sizeof(g_excp_table)/sizeof(g_excp_table[0]);

LPTSTR GetExceptionDescribe(DWORD dwCode)
{
 for (int i=0;i<g_excp_tableCount;i++)
 {
  if (g_excp_table[i].dwCode==dwCode)
  {
   return g_excp_table[i].lpDescribe;
  }
 }
 return _T("Unkown Exception!");
}

C++异常与结构化异常SEH的比较

结构化异常处理SEH(全称Structured Exception Handling),是Windows操作系统所提供的对错误或异常的处理机制,是Windows操作系统的一个重要组成部分。 在win...
  • suxinpingtao51
  • suxinpingtao51
  • 2014年05月13日 11:39
  • 1332

Win32结构化异常处理(SEH)——异常处理程序(__try/__except)

环境:VC++6.0, Windows XP SP3        上一篇中,我们看到了如何实现一个终止处理程序,和系统级的异常处理程序,在这一篇中,我们要着重看一下VC++6.0的异常处理程序是如何...
  • abcpanpeng
  • abcpanpeng
  • 2011年03月07日 16:21
  • 2220

漫谈兼容内核之二十四:Windows的结构化异常处理(一)

  结构化异常处理(Structured Exception Handling),简称SEH,是Windows操作系统的一个重要组成部分。在ReactOS内核的源代码中,特别是在实现系统调用的代码中,...
  • zytju1983
  • zytju1983
  • 2009年03月13日 00:36
  • 873

异常处理,保证代码稳定的必经之步----小话c语言(12)

[Mac 10.7.1 Lion  Intel-based  x64  gcc4.2.1] Q: c语言的异常处理可以使用什么? A: 可以使用setjmp和longjmp的组合。一个是保...
  • cxsjabcabc
  • cxsjabcabc
  • 2012年05月18日 15:15
  • 2100

Win32结构化异常处理(SEH)——异常处理程序(__try/__except)

环境:VC++6.0, Windows XP SP3        上一篇中,我们看到了如何实现一个终止处理程序,和系统级的异常处理程序,在这一篇中,我们要着重看一下VC++6.0的异常处理程序是如何...
  • mm350670610
  • mm350670610
  • 2010年04月29日 15:37
  • 3093

C++与Windows 32 结构化异常

C++的标准异常语句try catch只能捕获c++自身的异常。也就是throw 语句抛出的异常(也叫软异常) 而项目中很多地方出错的原因是由于空指针访问,除0,或者堆栈溢出所导致的。(通常是Win...
  • sesiria
  • sesiria
  • 2018年01月05日 18:24
  • 92

读windows核心编程,结构化异常部分,理解摘要

23章:结束处理程序: __try{}__finally{}块语句,能保证在运行完__try的语句后能调用__finally{}块中的语句,就算是提前的return,break,continue,go...
  • vagrxie
  • vagrxie
  • 2008年06月13日 20:28
  • 3771

《Visual C++异常处理机制原理与应用(二)—— C/C++结构化异常处理之try-finally终止处理的使用与原理(下)》

在上一篇文章中,我们其实只分析了终止型异常处理程序中正常的执行流程,这种情况的出现其实需要作如下假设: __try块中的代码执行过程中不会引发异常 这部分代码不会试图提前离开__try块的作用范围(如...
  • LPWSTR
  • LPWSTR
  • 2017年09月23日 22:36
  • 175

深入研究Win32结构化异常处理(SEH总结篇)

深入研究Win32结构化异常处理(SEH总结篇)   本文假设你熟悉WIN32,C/C++。 引言:   本文是在《Win32 结构化异常处理(SEH)探秘》基础上做的更新总结。探索MS...
  • zhoujiaxq
  • zhoujiaxq
  • 2014年04月10日 10:31
  • 1132

C语言中的异常处理机制

1.概述       什么是异常?异常一般指的是程序运行期(Run-Time)发生的非正常情况。异常一般是不可预测的,如:内存不足、打开文件失败、范围溢出等。UNIX 使用信号给出异常,并当发生异常...
  • tian_dao_chou_qin
  • tian_dao_chou_qin
  • 2011年05月03日 11:09
  • 12700
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:结构化异常处理和C++的异常处理区别
举报原因:
原因补充:

(最多只允许输入30个字)