`
grantren
  • 浏览: 77498 次
  • 来自: ...
文章分类
社区版块
存档分类
最新评论

对C++异常一些深入的讨论

阅读更多

异常

1. goto, break, return, continue和异常
 在try块内部, goto, break, return, continue 可以用来转移程序流程, 当这种情况发生时, 在try块内声明的所有变量都会被释放掉.

cpp 代码
  1. lab: try {   
  2.     T1 t1;   
  3.     try {   
  4.         T2 t2;   
  5.         if(condition) goto lab;   
  6.     } catch(...) {   
  7.         // handler2   
  8.     }   
  9. catch(...) {   
  10.     // handler1   
  11. }   

 
 在上面的例子中,当goto语句执行时,会先销毁t2,然后是t1. 这里假定condition语句没有声明变量. 如果在销毁t2时产生了exception, 那么程序的流程会转移到handler2. 如果在销毁t1时产生了exception, 那么程序的流程会转移到handler1.
 
2. 对于构造函数成员初始化表列,如果产生了异常,有专门的语法去处理:

cpp 代码
  1. int f(int);    
  2. class C {       
  3.     int i;       
  4.     double d;       
  5. public:       
  6.     C(intdouble);       
  7. };       
  8.       
  9. C::C(int ii, double id)        
  10. try : i(f(ii)), d(id) {       
  11.     // constructor function body       
  12. }       
  13. catch(...) {       
  14.     // handles exceptions thrown from the ctor-initializer       
  15.     // and from the constructor function body       
  16. }  

 3. 如果一个类的虚函数声明了异常规格,那么所有子类声明这个虚函数的异常规格必须包含在父类所允许的异常范围内,看下面的例子:

cpp 代码
  1. struct Base {   
  2.     virtual void f() throw (intdouble);   
  3.     virtual void g();   
  4. };   
  5.   
  6. struct Derived : Base {   
  7.     void f();               // ill-formed   
  8.     void g() throw(int);    // OK   
  9. };   

 

解释一下,f是一个虚函数,声明位于父类,是一个接口。最初的异常声明规格为throw (int, double),在Derived类中重写了虚拟表,f 当前的异常声明为则允许所有异常,这样扩大了原来允许的异常范围,所以发生了错误。
分享到:
评论

相关推荐

    关于C++异常处理和win32结构化异常处理

    关于C++异常处理和Win32结构化异常处理(Structured Exception Handling, SEH)的知识点,我们可以深入探讨其原理、差异以及如何在Windows平台上有效利用这两种机制。 ### C++异常处理 C++中的异常处理机制主要由`...

    c,c++异常处理

    深入讨论了placement new和delete的使用场景,以及如何处理构造函数抛出的异常。 - **placement new**: 介绍了placement new的操作原理及其应用场景。 - **处理构造函数异常**: 如何处理构造函数中可能抛出的异常。...

    c++faq ,讨论了关于c++的一些基本问题。英文。

    类的封装、继承和多态性是OOP的三大特性,这些在FAQ中会有深入讨论。 3. **模板**:C++模板允许我们编写泛型代码,可以应用于多种数据类型,包括类和基本类型。函数模板和类模板是模板的两种主要形式。 4. **STL...

    C_与C++中的异常处理.pdf

    在某些情况下,开发人员可能需要同时使用C++异常处理机制和Microsoft的SEH机制。这部分探讨了这两种异常处理方式之间的相互作用和如何在同一个程序中协调使用它们。 综上所述,异常处理是C与C++程序设计中的一个...

    清华大学C++讲义深入浅出c++

    《深入浅出C++》是清华大学出版的一份权威C++教学讲义,旨在为初学者提供一条从入门到精通的清晰路径。这份讲义由知名专家编写,充分体现了清华大学在计算机教育领域的深厚底蕴和严谨的教学风格。讲义内容涵盖了C++...

    C++异常机制的实现方式和开销分析

    在深入探讨C++异常机制之前,有必要强调一下为什么需要关注异常处理机制。在软件开发过程中,异常处理是确保程序健壮性和用户友好性的重要组成部分。尤其对于C++这种提供底层控制能力的语言而言,了解异常处理机制的...

    C++笔试面试宝典2009版与C++ String深入详解2.0版

    “C++ String深入详解2.0版”深入探讨了C++标准库中的std::string类,不仅包括了构造、赋值、比较、查找、插入、删除等操作的详细用法,还可能讨论了如何在C++字符串与传统C风格字符数组之间进行有效交互,帮助...

    深入C++ Accelerated C++

    根据提供的标题“深入C++ Accelerated C++”和描述“深入C++ Accelerated C++”,我们可以推断出这里讨论的主题是关于使用C++语言进行高效编程的技术和实践。标题中的“Accelerated C++”可能指的是《Accelerated ...

    《C++沉思录》是一本由 Scoot Meyers 所著的经典 C++ 编程书籍 该书深入探讨了 C++ 的一些高级概念和技术

    Scoot Meyers 在《C++沉思录》中对 C++ 语言的核心概念进行了深入的剖析。本书不仅介绍了 C++ 的基本语法,更重要的是它帮助读者理解 C++ 设计背后的理念与思想,从而能够更好地掌握这门语言。例如,书中会详细阐述 ...

    inside.the.c++.object.model.pdf_inside_C++_

    书中深入讨论了类型转换、静态类型与动态类型、类型信息的获取等话题,帮助读者理解类型在编译期和运行期的作用。 4. **继承与多态**:C++的继承是实现面向对象编程的关键特性。书中详述了继承层次结构中对象的构造...

    深入编程内幕——Visual C++.60

    其次,书中会深入讨论MFC(Microsoft Foundation Classes)库,这是一个用于构建Windows应用程序的类库。MFC将Windows API封装成易于使用的C++类,使得开发者可以更容易地实现窗口、菜单、对话框等功能。MFC的事件...

    Visual C++ 深入编程内幕

    作者可能会深入讨论这些主题,提供如何在Visual C++环境中高效利用它们的技巧和最佳实践。 其次,书中的“深入编程内幕”部分可能涉及到Visual C++特有的特性,例如MFC(Microsoft Foundation Classes)框架,它是...

    c与c++中的异常处理

    通过对异常的基本概念、C标准库中的异常处理方法、C++异常处理的基础语法和语义、具体的实例分析以及一些高级主题的深入探讨,读者可以更好地理解和应用异常处理技术,提高代码的质量和健壮性。

    深入编程内幕——VISUAL C++

    《深入编程内幕——Visual C++》是一本专为C++...通过阅读《深入编程内幕——Visual C++》,读者不仅可以深化对C++语言的理解,还能掌握在Visual Studio环境下高效开发的技巧,为成为专业的C++开发者奠定坚实基础。

    C++-talk.pdf

    此外,对C++的异常处理、类型系统、内存管理等特性的深入认识也是非常必要的。 通过这些内容,我们可以理解到本书所要传达的核心理念:在掌握基础语法之后,要深入到C++的对象模型和编译时的行为中去,才能真正掌握...

    C++沉思/C++编程思想

    《C++编程思想》(Thinking in C++)由Bruce Eckel编写,这本书以一种易于理解的方式介绍了C++的基础知识,包括类、对象、模板等核心概念,同时也深入讨论了C++的STL(标准模板库)以及异常处理等高级主题。...

Global site tag (gtag.js) - Google Analytics