关于异常信息

a220315410 2010-09-30 04:10:09
ExceptionFlags的值为1,则表示不可继续的异常,ExceptionFlags值为0,表示可继续的异常。
那么我想问,哪些异常属于不可继续的,哪些异常又属于可继续的异常呢?

public const uint EXCEPTION_ACCESS_VIOLATION = STATUS_ACCESS_VIOLATION;
//线程试图对一个虚地址进行读或写,但没有做适当的存取
public const uint STATUS_ACCESS_VIOLATION = 0xC0000005;

public const uint EXCEPTION_ARRAY_BOUNDS_EXCEEDED = STATUS_ARRAY_BOUNDS_EXCEEDED;
//数组访问越界
public const uint STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C;

public const uint EXCEPTION_DATATYPE_MISALIGNMENT = STATUS_DATATYPE_MISALIGNMENT;
//线程试图读或写不支持对齐( a l i g n m e n t)的硬件上的未对齐的数据
public const uint STATUS_DATATYPE_MISALIGNMENT = 0x80000002;

public const uint EXCEPTION_FLT_DENORMAL_OPEvRAND = STATUS_FLOAT_DENORMAL_OPERAND;
//浮点操作中一个操作数不正常
public const uint STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D;

public const uint EXCEPTION_FLT_DIVIDE_BY_ZERO = STATUS_FLOAT_DIVIDE_BY_ZERO;
//试图使用浮点数0来除一个浮点数
public const uint STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E;

public const uint EXCEPTION_FLT_INEXACT_RESULT = STATUS_FLOAT_INEXACT_RESULT;
//浮点操作的结果不能精确表示成十进制小数
public const uint STATUS_FLOAT_INEXACT_RESULT = 0xC000008F;

public const uint EXCEPTION_FLT_INVALID_OPERATION = STATUS_FLOAT_INVALID_OPERATION;
//其他的浮点数异常
public const uint STATUS_FLOAT_INVALID_OPERATION = 0xC0000090;

public const uint EXCEPTION_FLT_OVERFLOW = STATUS_FLOAT_OVERFLOW;
//浮点数溢出
public const uint STATUS_FLOAT_OVERFLOW = 0xC0000091;

public const uint EXCEPTION_FLT_STACK_CHECK = STATUS_FLOAT_STACK_CHECK;
//浮点数造成的栈溢出或者下溢
public const uint STATUS_FLOAT_STACK_CHECK = 0xC0000092;

public const uint EXCEPTION_FLT_UNDERFLOW = STATUS_FLOAT_UNDERFLOW;
//浮点数操作的结果小于允许的值
public const uint STATUS_FLOAT_UNDERFLOW = 0xC0000093;

public const uint EXCEPTION_GUARD_PAGE = STATUS_GUARD_PAGE_VIOLATION;
//线程试图访问带有PAGE_GUARD属性的内存页
public const uint STATUS_GUARD_PAGE_VIOLATION = 0x80000001;

public const uint EXCEPTION_ILLEGAL_INSTRUCTION = STATUS_ILLEGAL_INSTRUCTION;
//线程执行了一个无效的指令
public const uint STATUS_ILLEGAL_INSTRUCTION = 0xC000001D;

public const uint EXCEPTION_IN_PAGE_ERROR = STATUS_IN_PAGE_ERROR;
//页内故障
public const uint STATUS_IN_PAGE_ERROR = 0xC0000006;

public const uint EXCEPTION_INT_DIVIDE_BY_ZERO = STATUS_INTEGER_DIVIDE_BY_ZERO;
//试图用整数0除一个整数
public const uint STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094;

public const uint EXCEPTION_INT_OVERFLOW = STATUS_INTEGER_OVERFLOW;
//整数溢出
public const uint STATUS_INTEGER_OVERFLOW = 0xC0000095;

public const uint EXCEPTION_INVALID_DISPOSITION = STATUS_INVALID_DISPOSITION;
//异常过滤器返回值无效
public const uint STATUS_INVALID_DISPOSITION = 0xC0000026;

public const uint EXCEPTION_INVALID_HANDLE = STATUS_INVALID_HANDLE;
//无效的句柄
public const uint STATUS_INVALID_HANDLE = 0xC0000008;

public const uint EXCEPTION_NONCONTINUABLE_EXCEPTION = STATUS_NONCONTINUABLE_EXCEPTION;
//致命异常
public const uint STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025;

public const uint EXCEPTION_PRIV_INSTRUCTION = STATUS_PRIVILEGED_INSTRUCTION;
//线程执行的指令操作在当前机器模式不被允许
public const uint STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096;

public const uint EXCEPTION_SINGLE_STEP = STATUS_SINGLE_STEP;
//单步执行
public const uint STATUS_SINGLE_STEP = 0x80000004;

public const uint EXCEPTION_STACK_OVERFLOW = STATUS_STACK_OVERFLOW;
//堆栈溢出
public const uint STATUS_STACK_OVERFLOW = 0xC00000FD;

以上这些异常,哪些是可继续的,哪些不可继续呢?
...全文
496 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
a220315410 2010-10-19
  • 打赏
  • 举报
回复
又是一个马后炮,嘛嘛更正一下,真理总是在不断的追寻中:
ExceptionFlags代表了异常过滤程序能否在处理这个异常的时候返回EXCEPTION_CONTINUE_EXECUTOIN值。当ExceotionFlags为EXCEPTION_NONCONTINUE时,是不允许异常过滤器返回EXCEPTION_CONTINUE_EXECUTOIN的。
其实根据ExceptionCode的组成规则来是,凡是0xC开头的异常都是严重错误,一般都无法继续。
有兴趣的可以参考《windows核心编程》24章第6,7小节
a220315410 2010-10-11
  • 打赏
  • 举报
回复
呵呵,谢谢雪山飞狐的解释,结帖咯~
visualwind 2010-10-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 a220315410 的回复:]

恩,谢谢雪山飞狐的解答。
关于Windows的SEH,我之前也看过一些资料了,《深入探索Win32结构化异常处理》和Windows核心编程的第五部分,我都看了不止一遍。嘛,不过对于一个新手来说,还真是看的半懂不懂。
别的还有资料推荐么?
[/Quote]

看这些就够了,剩下的就是在实践中领会了,这个只有实践多了才能理解。如果想要进一步了解的话,那只能看逆向工程里面关于异常处理的部分,从系统机制或者二进制的角度理解异常了。
a220315410 2010-10-11
  • 打赏
  • 举报
回复
恩,谢谢雪山飞狐的解答。
关于Windows的SEH,我之前也看过一些资料了,《深入探索Win32结构化异常处理》和Windows核心编程的第五部分,我都看了不止一遍。嘛,不过对于一个新手来说,还真是看的半懂不懂。
别的还有资料推荐么?
visualwind 2010-10-08
  • 打赏
  • 举报
回复
其实很多异常也要看实际情况,不能一概而论能否继续。
傻X 2010-10-08
  • 打赏
  • 举报
回复
4楼挺神的,另外个人觉得:
public const uint EXCEPTION_INVALID_HANDLE = STATUS_INVALID_HANDLE;
//无效的句柄
public const uint STATUS_INVALID_HANDLE = 0xC0000008;
能继续

有问题。
visualwind 2010-10-08
  • 打赏
  • 举报
回复
public const uint EXCEPTION_ACCESS_VIOLATION = STATUS_ACCESS_VIOLATION;
//线程试图对一个虚地址进行读或写,但没有做适当的存取
public const uint STATUS_ACCESS_VIOLATION = 0xC0000005;
不能继续

public const uint EXCEPTION_ARRAY_BOUNDS_EXCEEDED = STATUS_ARRAY_BOUNDS_EXCEEDED;
//数组访问越界
public const uint STATUS_ARRAY_BOUNDS_EXCEEDED = 0xC000008C;
不能继续

public const uint EXCEPTION_DATATYPE_MISALIGNMENT = STATUS_DATATYPE_MISALIGNMENT;
//线程试图读或写不支持对齐( a l i g n m e n t)的硬件上的未对齐的数据
public const uint STATUS_DATATYPE_MISALIGNMENT = 0x80000002;
能继续

public const uint EXCEPTION_FLT_DENORMAL_OPEvRAND = STATUS_FLOAT_DENORMAL_OPERAND;
//浮点操作中一个操作数不正常
public const uint STATUS_FLOAT_DENORMAL_OPERAND = 0xC000008D;
能继续

public const uint EXCEPTION_FLT_DIVIDE_BY_ZERO = STATUS_FLOAT_DIVIDE_BY_ZERO;
//试图使用浮点数0来除一个浮点数
public const uint STATUS_FLOAT_DIVIDE_BY_ZERO = 0xC000008E;
不能继续

public const uint EXCEPTION_FLT_INEXACT_RESULT = STATUS_FLOAT_INEXACT_RESULT;
//浮点操作的结果不能精确表示成十进制小数
public const uint STATUS_FLOAT_INEXACT_RESULT = 0xC000008F;
能继续

public const uint EXCEPTION_FLT_INVALID_OPERATION = STATUS_FLOAT_INVALID_OPERATION;
//其他的浮点数异常
public const uint STATUS_FLOAT_INVALID_OPERATION = 0xC0000090;
能继续

public const uint EXCEPTION_FLT_OVERFLOW = STATUS_FLOAT_OVERFLOW;
//浮点数溢出
public const uint STATUS_FLOAT_OVERFLOW = 0xC0000091;
能继续

public const uint EXCEPTION_FLT_STACK_CHECK = STATUS_FLOAT_STACK_CHECK;
//浮点数造成的栈溢出或者下溢
public const uint STATUS_FLOAT_STACK_CHECK = 0xC0000092;
能继续

public const uint EXCEPTION_FLT_UNDERFLOW = STATUS_FLOAT_UNDERFLOW;
//浮点数操作的结果小于允许的值
public const uint STATUS_FLOAT_UNDERFLOW = 0xC0000093;
能继续

public const uint EXCEPTION_GUARD_PAGE = STATUS_GUARD_PAGE_VIOLATION;
//线程试图访问带有PAGE_GUARD属性的内存页
public const uint STATUS_GUARD_PAGE_VIOLATION = 0x80000001;
不能继续

public const uint EXCEPTION_ILLEGAL_INSTRUCTION = STATUS_ILLEGAL_INSTRUCTION;
//线程执行了一个无效的指令
public const uint STATUS_ILLEGAL_INSTRUCTION = 0xC000001D;
不能继续

public const uint EXCEPTION_IN_PAGE_ERROR = STATUS_IN_PAGE_ERROR;
//页内故障
public const uint STATUS_IN_PAGE_ERROR = 0xC0000006;
要看情况

public const uint EXCEPTION_INT_DIVIDE_BY_ZERO = STATUS_INTEGER_DIVIDE_BY_ZERO;
//试图用整数0除一个整数
public const uint STATUS_INTEGER_DIVIDE_BY_ZERO = 0xC0000094;
不能继续

public const uint EXCEPTION_INT_OVERFLOW = STATUS_INTEGER_OVERFLOW;
//整数溢出
public const uint STATUS_INTEGER_OVERFLOW = 0xC0000095;
能继续

public const uint EXCEPTION_INVALID_DISPOSITION = STATUS_INVALID_DISPOSITION;
//异常过滤器返回值无效
public const uint STATUS_INVALID_DISPOSITION = 0xC0000026;
能继续

public const uint EXCEPTION_INVALID_HANDLE = STATUS_INVALID_HANDLE;
//无效的句柄
public const uint STATUS_INVALID_HANDLE = 0xC0000008;
能继续

public const uint EXCEPTION_NONCONTINUABLE_EXCEPTION = STATUS_NONCONTINUABLE_EXCEPTION;
//致命异常
public const uint STATUS_NONCONTINUABLE_EXCEPTION = 0xC0000025;
不能继续

public const uint EXCEPTION_PRIV_INSTRUCTION = STATUS_PRIVILEGED_INSTRUCTION;
//线程执行的指令操作在当前机器模式不被允许
public const uint STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096;
能继续

public const uint EXCEPTION_SINGLE_STEP = STATUS_SINGLE_STEP;
//单步执行
public const uint STATUS_SINGLE_STEP = 0x80000004;
不能继续

public const uint EXCEPTION_STACK_OVERFLOW = STATUS_STACK_OVERFLOW;
//堆栈溢出
public const uint STATUS_STACK_OVERFLOW = 0xC00000FD;
不能继续

LZ该加压时就减压
a220315410 2010-10-08
  • 打赏
  • 举报
回复
谢谢了,最近问问题都不是太顺利,有3张帖子没结了,压力忒大了点~
a220315410 2010-10-08
  • 打赏
  • 举报
回复
谢谢了,最近问问题都不是太顺利,有3张帖子没结了,压力忒大了点~
visualwind 2010-10-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 a220315410 的回复:]
谢谢大家的解答,看样子,根据异常的类型来判断异常能否继续是行不通的啊。
从理论上来说,ExceptionFlags应该是可以判断异常能否继续的(非0则不可继续,为0则可继续)
不过之所以跑过来发这张帖子,是因为我在代码中写了

C# code
int a = 0;
int b = 1/a;

造成了一个整数除零异常。而我截获到的ExceptionFla……
[/Quote]

用try-catch就能继续了。
如果LZ真想深入研究的话,建议看看windows结构化异常处理,包括异常处理链,异常的结构体,如何异常处理函数等等。
a220315410 2010-10-08
  • 打赏
  • 举报
回复
谢谢大家的解答,看样子,根据异常的类型来判断异常能否继续是行不通的啊。
从理论上来说,ExceptionFlags应该是可以判断异常能否继续的(非0则不可继续,为0则可继续)
不过之所以跑过来发这张帖子,是因为我在代码中写了
int a = 0;
int b = 1/a;

造成了一个整数除零异常。而我截获到的ExceptionFlags = 0;说明这个是一个可继续的异常。
但是程序也还是崩溃了。
那这个可继续的异常又代表了什么?
而且我和雪山飞狐的观点一样,除零异常应该是不可继续的。实际上程序也的确没继续。
那为什么我截获到的信息是ExceptionFlags = 0呢?
Summer_King 2010-10-07
  • 打赏
  • 举报
回复
帮你顶顶

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧