zoukankan      html  css  js  c++  java
  • C++异常与windows结构化异常处理简单说明

    一、C++标准异常

    try
    {
        ……
        throw <exception-data>
        ……
    }
    catch (<exception-declaration 1>)
    {
        ……
    }
    catch (<exception-declaration 2>)
    {
        ……
    }

    try块中的throw会抛出一个数据<exception-data>,比如一个整数,一个字串,或是其他自定义类型的数据。这时,当前程序中止执行,开始查找catch入口。throw抛出的数据类型与catch入口的<exception-declaration>数据类型必须匹配,这一点类似函数调用的形参、实参匹配。一个try块可以对应多个catch块,也可以用catch (…)来接收所有可能抛出的数据。

    强调:必须是在程序代码快中有出现异常时主动抛出异常才会,异常才能截获进入异常处理,也就是说,如果程序中没有throw你加上try块也是没有意义的.

     二、Windows SEH

    SEH(Structured Exception Handling),即结构化异常处理,是Microsoft提供的异常处理机制。要了解这个机制,咱先来了解一下__try-__except关键字。

    1. __try-__except关键字

    __try
    {
        ……
    }

    __except (<exception>)
    {
        ……
    }

    __try-__except是Microsoft扩展出的C++关键字,__try块中出现错误或异常,一般不再用throw抛出,而是直接产生一个EXCEPTION_POINTERS类型的异常数据,然后开始查找SEH例程入口(调试的情况除外)。首先就会找到与__try块对应的__except块。__except的参数<exception>与catch的参数作用完全不同,也不类似于函数的参数,它主要是用于控制后面的程序执行,为这几个值之一:

    EXCEPTION_EXECUTE_HANDLER(1)         表示下面执行__except块内及其后面的代码
    EXCEPTION_CONTINUE_EXECUTION(-1)  表示回到抛出异常处继续向下执行
    EXCEPTION_CONTINUE_SEARCH(0)         表示查找下一个异常处理例程入口

    Microsoft提供两个函数GetExceptionCode(), GetExceptionInformation(),分别可以获取异常号和EXCEPTION_POINTERS类型的异常数据指针。而且这两个函数只能在__except参数<exception>的表达式中使用。所以,__except一行一般会这样写:__except (ExceptFilterFunc(GetExceptionInformation())),其中ExceptFilterFunc是一个自定义的异常处理例程,它输入一个EXCEPTION_POINTERS *类型的参数,返回EXCEPTION_EXECUTE_HANDLER、EXCEPTION_CONTINUE_EXECUTION或EXCEPTION_CONTINUE_SEARCH。

    在VC中,还提供__try-__finally块和__leave关键字,MSDN查查。

    附:

    C++标准异常处理 可以在标准C++书中找到相关介绍
    Windows SEH可以在WINDOWS核心编程.chm查看详细介绍.

  • 相关阅读:
    提升键盘可访问性和AT可访问性
    2个小技巧
    设计模式(6): 数据抽象与业务封装
    目录
    医疗经济学
    医疗场景下的行为经济学(三)
    抗体、免疫
    医疗场景下的行为经济学(二)
    医疗场景下的行为经济学(一)
    单身社会如何生活-日本纪录片ガイアの夜明け系列
  • 原文地址:https://www.cnblogs.com/mlog/p/2456374.html
Copyright © 2011-2022 走看看