设为首页 加入收藏

TOP

C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理(二)
2015-07-24 07:26:39 来源: 作者: 【 】 浏览:269
Tags:Primer 学习 笔记 _87_ 用于 大型 程序 工具 异常 处理
够重要的、使程序不能继续正常执行的事件。如果找不到匹配的catch,程序就调用库函数terminate[你懂得。。。]!



三、捕获异常

catch子句中的异常说明符看起来像只包含一个形参的形参表,异常说明符是在其后跟一个(可选)形参名的类型名。

说明符的类型决定了处理代码能够捕捉的异常种类。类型必须是完全类型,即必须是内置类型或者是已经定义了的程序员自定义的类型。类型的前向声明不行

当catch为了处理异常只需要了解异常的类型的时候,异常说明符可以省略形参名;如果处理代码需要已发生异常的类型之外的信息,则异常说明符就包含形参名,catch使用这个名字访问异常对象。



1、查找匹配的处理代码

在查找匹配的catch期间,找到的catch不必是与异常最匹配的那个,相反,将选中第一个找到的可以处理该异常的catch。因此,在catch子句列表中,最特殊的catch必须最先出现。

异常与catch异常说明符匹配:大多数转换都不允许 --除下面几种可能的区别之外,异常的类型与catch说 明符的类型必须完全匹配:

1)允许从非constconst的转换。也就是说,非const对象的 throw可以与指定接受const引用的 catch匹配。

2)允许从派生类型型到基类类型的转换。

3)将数组转换为指向数组类型的指针,将函数转换为指向函数类型的适当指针。

在查找匹配catch的时候,不允许其他转换。具体而言:既不允许标准算术转换,也不允许为类类型定义的转换[好绝情%>_<%]。



2、异常说明符

进入catch的时候,用异常对象初始化catch的形参。像函数形参一样,异常说明符类型可以是引用。异常对象本身是被抛出对象的副本。是否再次将异常对象复制到catch位置取决于异常说明符类型。

如果说明符不是引用,就将异常对象复制到catch形参中,对形参所做的任何改变都只作用于副本,不会作用于异常对象本身。如果说明符是引用,则像引用形参一样,不存在单独的catch对象,

catch形参只是异常对象的另一名字。catch形参所做的改变作用于异常对象



3、异常说明符与继承

像形参声明一样,基类的异常说明符可以用于捕获派生类型的异常对象,而且,异常说明符的静态类型决定catch子句可以执行的动作。如果被抛出的异常对象是派生类类型的,但由接受基类类型的catch处理,那么,catch不能使用派生类特有的任何成员。

【最佳实践】

通常,如果catch子句处理因继承而相关的类型的异常,它就应该将自己的形参定义为引用。此时catch对象的静态类型可以与catch对象所引用的异常对象的动态类型不同。

如果catch对象是基类类型对象而异常对象是派生类型的,就将异常对象分割为它的基类子对象。

对象(相对于引用)不是多态的。对象的静态类型和动态类型相同,函数是虚函数也一样。只有通过引用或指针调用时才发生动态绑定,通过对象调用不进行动态绑定



4、catch子句的次序必须反映类型层次

将异常类型组织成类层次的时候,用户可以选择应用程序处理异常的粒度级别。例如,只希望清除并退出的应用程序可以定义一个try块,try块包围main函数中带有如下catch代码:

    catch(exception &e)
    {
        cerr << "Exiting: " << e.what() << endl;
        size_t status_indicator = 42;
        return(status_indicator);
    }

有更严格实时需求的程序可能需要更好的异常控制,这样的应用程序将清除导致异常的一切并继续执行

因为catch子句按出现次序匹配,所以使用来自继承层次的异常的程序将它们的catch子句排序,以便派生类型的处理代码出现在其基类类型的catch之前

【注解】

带有因继承而相关的类型的多个catch子句,必须从最低层派生类型到最高派生类型排序。如下题:

//P585 习题17.3
    try
    {
        //...
    }
    catch(overflow_error eobj)
    {
        //...
    }
    catch(const runtime_error &re)
    {
        //...
    }
    catch(exception)
    {

    }

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1150 The Last Non-zero Digi.. 下一篇XTU OJ 1163 查询成绩 (字符串+..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: