您的位置:首页 > 编程语言 > C语言/C++

C/C++ 之 异常处理机制核心观点

2016-03-21 21:01 246 查看


    C++异常处理机制核心观点:

    0.  如果使用普通的处理方式:ASSERT, return等已经足够简洁明了,请不要使用异常处理机制。

    1.  比C的setjump, longjump优秀。

    2.  可以处理任意类型的异常。

         你可以人为地抛出任何类型的对象作为异常。

         throw  100;

         throw  "Hello";

         ...

    3.  需要一定的开销,频繁执行的关键代码端避免使用C++异常处理机制。

    4.  其强大的能力表现在:

        A.  把可能出现异常的代码和异常处理代码隔离开,结构更清晰。

        B.  把内层错误的处理直接转移到适当的外层来处理,化简了处理流程。传统的手段是通过一层层返回错误代码把错误转移到上层,再转移到上上层,当层数过多时需要非常多的判断,以采取适当的策略。

        C.  局部出现异常时,在执行处理代码之前,会执行堆栈退出,即为所有局部对象调用析构函数,保证局部对象行为良好。

        D.  可以在出现异常时保证不产生内存泄漏。通过适当的try, catch布局,可以保证delete pobj; 一定被执行。

        E.  在出现异常时,能够获取异常信息,指出异常原因。并可以给用户优雅的提示。

        F.  可以在处理块中尝试错误恢复,保证程序几乎不会崩溃。通过适当的处理,即使出现除0异常,内存访问违例,也能让程序不崩溃,继续运行,这种能力在某些情况下极其重要。

    以上ABCDEF可以使你的程序更稳固,健壮,不过有时让程序崩溃似乎更容易找到原因,程序老是不崩溃,如果处理结果有问题,有时很难查找

    5.  并不是只适用于处理“灾难性的”事件。普通的错误处理也可以使用异常机制来处理,不过,如果将此滥用的话,可能造成程序结构混乱因为异常处理机制本质上是程序处理流程的转移,不恰当的,过度的转移显然将造成混乱。许多人认为应该只在“灾难性”事件上使用异常处理,以避免异常处理机制本身带来的开销,你可以认为这句话通常是对的。

    6.  先让程序更脆弱,再让程序更坚强。首先,它使程序非常脆弱,稍有差错,马上执行流程跳转掉,去寻找相应的处理代码,以求适当的解决方式,如果找不到任何解决办法(异常没有被捕获并处理),(立刻)结束程序运行。

    很像一个人随身带着许多药品,防护工具出行,稍有头晕,马上拿出清凉油,遇到蚊子立刻拿出点蚊拍灭之,遇到哪怕是蚊虫叮咬,如果找不到电蚊拍,他马上自杀!(这家伙真是脆弱:) ,以致于我们必须为他准备所有的防护工具,一旦我们为他准备了全部适当的防护工具,他就变成一个非常坚强的人了!)。

    当然,代价是这家伙比较笨重,行动迟缓。

    WINDOWS:

    7.  将结构化异常处理结合/转换到C++异常对象,可以更好地处理WINDOWS程序出现的异常。

    8.  尽一切可能使用try, catch, 而不是win32本身的结构化异常处理,或者MFC中的TRY, CATCH宏。

    用的恰到好处,方显C++异常之美妙!

 

    下面的内容是我从《C++面向对象程序设计(第五版)》找到值得学习的内容

    catch(...)

    {

    }

    这三个点并不是说要省略什么。相反,你需要在程序中实际输入这三个点。这一个很好的默认的catch块,应该把它放在其他所有catch块之后

后记:异常规范

    Double safe_divide(int top,  int bottom)  throw(DivideByZero)

    假如在函数中抛出一个异常,但异常规范中并未列出这个异常(也没有在函数内部捕捉),会发生什么事情?在这种情况下,程序会终止。它不会被任何catch块捕捉,而是直接导致程序终止。记住,如果完全没有异常规范化列表,就连空白的也没有,那么效果等同于在规范列表中列出所有异常。在这种情况下,抛出一个异常不会终止程序。

    注意,异常规范是为那些准备跑到函数外部的异常而准备的。如果它们不跑到函数外部,就不归入异常规范。如果它们要跑到函数外部,就应该归入异常规范,无论它们起源于何处。如果在函数定义内部的一个try块中抛出一个异常,而且在函数定义的内部的一个catch块中捕捉这个异常,这个异常的类型就不需要在异常规范中列出。如果函数定义包括对另一个函数的调用,而另一个函数可能抛出一个它自己不会捕捉的异常,就要在异常规范中列出异常的类型。

    要表示一个函数不应抛出任何不在函数内部捕捉的异常,需要使用一个空白异常规范。

    Void  some_function()  throw();

    几种方式可以总结如下:

    Void  some_function()  throw(DivideByZero, OtherExecption);

    //DivideByZero或OtherException类型的异常会被正常处理。

    //至于其他任何异常,如果抛出来后未在函数主体中捕捉,就会终止程序。

    Void some_function()  throw();

    //空异常列表:一旦抛出任何未在函数主体中捕捉的异常就会终止程序

    Void some_function();

    //正常处理所有类型的所有异常。
http://blog.csdn.net/ixidof/article/details/5295536 http://blog.csdn.net/broadview2006/article/details/3772488 http://blog.csdn.net/DelphiNew/article/details/1376439 http://blog.csdn.net/lanbing510/article/details/5897059
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  异常 C++ try catch exception