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

异常处理与CrashRpt工具——(1) 除此之外,我们可以为每一个异常设置若干处理函数,而这些处理函数会被放到一个链表中,当异常到达时,这些处理函数会被调用。语句不是这个异常错误所对应的正确异常处理模块,不能处理该异常,通知操作系统继续搜寻该线程其他的异常处理程序(系统将继续到上一层的。复合语句中的受保护执行的代码发生了异常,或受保护执行的代码调用的函数内部发生了异常并要求调用者来处理该异常,这样的语句是catch不到的,直接就会crash了,因为这是内存错误,硬件异常。中的代码,是在正常执行完之后进来的,还是因为全局展开或局部展开而进入的。 阅读详情

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++反作弊对抗实战 (进阶篇 —— 9.利用硬件断点 + 结构化异常 SEH HOOK) SEH(Struct Exception Handler,结构化异常) VEH(Vector Exception Handler,向量异常处理) SEH是OS提供给线程来感知处理异常的一种回调机制。在Intel Win32平台上,由于FS寄存器问题指向当前的TIB(线程信息块),因此FS:[0]处能找到最新的一个 阅读详情

相关推荐

从奔溃记录的dump中获取异常信息并解决的基本流程

本文由Markdown语法编辑器编辑完成。1. dump文件是什么?2. 如何基于dump文件获取程序奔溃信息3. dump解决问题示例:已知从一次奔溃中生成的dump文件中显示的异常信息为: Exception Information: The thread tried to read from or write to a virtual address for which it does no

inter_peng的专栏 2829

SVN错误:Thread attempted to read nesting count of a lock it did not own

今天打开myeclipse 不知道为什么,更新程序的时候一直出现:“Thread attempted to read nesting count of a lock it did not own”这个错误,在网上查了资料 例如解决方法: 打开 : windows ->preferences->General->Appearance->Lable Decorations 勾选其中的 SVN 项...

jianglihua1986 975

常见Win32异常错误码

Value Macro Meaning 0x80000002 EXCEPTION_DATATYPE_MISALIGNMENT The thread tried to read or write data that is misaligned on hardware that does not provide alignment. For example, 16-bit val

登山 8385

Linux Top 命令解析

TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定. top - 12:38:33 up 5

zhiwei_yang的专栏 476

Access Violation(非法访问)错误的解决方法

Access Violation(非法访问),General Protection Fault(一般保护性错误)或者Invalid Page Fault(无效页面错误),虽然说法不一样,但本质上总是由同一种错误引起的。Access Violation常常在计算机用户运行的程序试图存取未被指定使用的存储区时遇到。 Access violation at address in module

crkres9527 6万+

C语言异常处理结构化异常处理有什么区别?

原文:http://jsj.nhjsj.net/nh12/Cstudy/ShowArticle.asp?ArticleID=42 总的来说,结构化异常处理异常处理之间的区别就是Microsoft对异常处理程序在实现上的不同。所谓的“普通”C++异常处理使用了三条附加的c++语句:try,catchthrow。这些语句的作用是,当正在执行的程序出现异常情况时,允许一个程序(异常处理程序)试着...

玄冬Wong 234

什么是 c++结构化异常处理 SEH

SEH是Windows平台上处理系统级异常的有效工具,适合处理硬件异常系统错误。尽管功能强大,但使用时需注意其平台依赖性性能影响。

抟土成人祖,炼石补青天。眼中览银河,手可摘星辰。 669

Visual C++ 里的异常处理

简介 微软Visual C++是Win32最广泛使用的编译器,因此Win32反向器对其内部工作非常熟悉。能够识别编译器生成的粘合代码有助于快速集中于程序员编写的实际代码。它还有助于恢复程序的高级结构。我将集中讨论MSVC编译程序中的堆栈布局、异常处理相关结构。假设对汇编程序、寄存器、调用约定等有一定的了解。 名词解释: Stack frame — 堆栈帧,函数使用的堆栈段的片段。通常包含函数参数、返回调用方地址、保存的寄存器、局部变量其他特定于此函数的数据。在x86(大多数其他架构)上,调用者被调

CoderAldrich的专栏 1585

Windows核心编程:结构化异常处理

 作者:shenzi链接:http://blog.csdn.net/shenzi Windows核心编程:结构化异常处理     结构化异常处理(structured exception handling,SEH)带来的好处是我们在写代码时,可以先集中精力完成软件的正常工作流程。如果在运行的时候出现了什么问题,系统

shenzi的天空 3772

Windows核心编程笔记-Windows提供的结构化异常处理(SEH)

Windows提供的结构化异常处理(SEH)   1.结束处理主要是由编译器来实现,异常处理操作系统实现的要多一些   2.当异常块出现时,编译器要生成特殊的代码,并且生成一些表结构来处理SEH,另外还要生成     一些回调函数   3.SEH与C++异常处理不同一、结束处理   1.使用形式   _try   {     //processing   }    _finally   {   

moonson的专栏 776

CC++的主要区别

C语言C++在语言本质、编译机制关键字等方面存在显著差异。C语言是面向过程的结构化编程语言,强调通过函数过程组织代码,适合系统级编程,但数据行为的封装较弱。C++则支持面向对象面向过程的混合式编程,提供类、封装、继承多态等特性,适合构建复杂软件系统。在编译机制上,C语言直接生成目标代码,而C++通过名称修饰处理函数重载。此外,C++在C语言的基础上扩展了关键字功能,如引用、模板等,使其更具灵活性强大性。

weixin_43484713的博客 2177

try catch异常处理与SEH

转自:http://www.soft-bin.com/html/2010/08/06/try_catch_and_seh.html 作者: luckzj发表时间: 2010年8月6日本文链接: http://www.soft-bin.com/html/2010/08/06/try_catch_and_seh.htmlcopy right (c) http://soft-bin

duhaomin的专栏 3102

[笔记]Windows核心编程《二十三》结构化异常处理

文章目录前言总结1.SEH(Structured Exception Handling)SJLJ(SetJump LongJump)区别对比 前言 总结 1.SEH(Structured Exception Handling)SJLJ(SetJump LongJump)区别对比

二次元怪兽的博客 853

C,C++,MFC 异常处理(zz)

以前开发c,c++,mfc程序的时候,错误处理这部分一直比较混乱。因为历史上的原因,用c,c++,mfc开发windows程序时,很多api处理错误的方式是通过返回一个值,然后规定返回值什么时候代表成功,什么时候代表失败。如果想要得到更加具体的结果信息,就要调用GetLastError来获得错误代码(也可能是正确代码,与之相应的可以调用SetLastError设置错误代码)。我个人认为这种错误处理

afxid的专栏 4611

结构异常C++异常

: 本文原出处不详! Windows结构异常有如下几个特性: 1、它使用__try、__except、__finally__leave关键字RaiseException API; 2、它由Windows所支持,因此它不适合其它操作系统 3、它不处理C++对象

狂人山庄 742

C++结构化异常处理

include "stdafx.h" #include using namespace std; class Exception { public:     static void MapSEtoCE(void ) ...{_set_se_translator(TranslateSEtoCE); }     operator DWORD() ...{ return er.ExceptionC

214

【Windows核心编程笔记】第二十五章 未处理异常、向量化异常处理C++异常

SetUnhandledExceptionFilter 处理异常的最后机会,一般在进程初始化时调用此函数 异常过滤函数原型: LONG WINAPI TopLevelUnhandledExceptionFilter( PEXCEPTION_POINTERS pEx) UnhandledExceptionFilter函数详解 允许对资源进行写入操作并继续执行 将未处理异常...

半雨微凉 520
上一篇: 用c++实现com组件示例
下一篇: 如何实现音频淡入淡出效果
sheltonwan
博客等级 码龄20年 77粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值