异常处理机制专题1

简介: 异常处理机制专题1

1.异常是一种程序控制机制,与函数机制独立和互补

  •   函数是一种以栈结构展开的上下函数衔接的程序控制系统。(系统栈,函数调用模型)
  •   异常时另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作为捕捉条件,  从而以类型匹配在栈机制中跳跃回馈

2.异常设计目的

       栈机制是一种高度节律性控制机制,面向对象编程去要求对象之间有方向、有目的的控制传动。从一开始,异常处理就是冲着改变程序控制结构,以适应面向对象程序更有效地工作这个主题,而不是仅仅为了进行错误处理。

       异常设计出来之后,却发现在错误处理方面获取最大的好处


异常处理的基本思想

传统的异常处理机制:通过返回值来处理错误  在同一个函数中 【典型:C语言,系统库的一些函数】

C++异常处理:

1.C++的异常处理机制使得异常的引发和异常的处理不必在同一个函数中,这样底层的函数可以着重解决具体问题,而不必过多的考虑异常的处理。上层的调用者可以在适当的位置设计对不同类型的异常的处理。【实现了异常的处理与异常的发生的分离】

2.异常时专门针对抽象编程中的一系列错误处理的,C++中不能借助函数机制,函数是基于栈结构的,栈结构的特点是先进后出,依次访问,不能插队,但错误处理的特征是遇到错误信息就想要转到若干级之上重新尝试。

3.异常超脱于函数机制,决定了其对函数的跨越式回跳

4.异常跨越函数


异常基本语法

抛出异常的程序手段:

void fun()

 { 

      throw  表达式;

 }

捕捉并处理异常

try

{

        ....

}           

catch(异常类型声明)

        ...

catch(类型(参数))

        ....      

1)如果有异常则通过throw操作创建一个异常对象并抛掷

2)将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺利执行到达try语句,然后执行try块内的保护段

3)如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去

4)catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕捉并处理异常(或者继续抛掷异常)

5)如果匹配的处理器未能找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序

6)处理不了的异常,可以在catch的最后一个分支,使用throw语法,向上扔


程序案例


terminate调用的情况

#include <iostream>
using namespace std;
class A{};
class B{};
void f()
{
    int a = 0;
    if(a == 0) throw A();
}
void g()
{
    try{
        f();
    }
    catch(B e){
        cout<<"exception B\n"<<endl;
    }
}
int main(void)
{
    g();
    return 0;
}

throw A将穿透函数 f,g,main。抵达系统最后一道防线----激发terminate函数。该函数调用了abort函数终止程序的运行。

最后一道防线的函数可以由程序员设置,从而规定其终止前的行为

修改系统默认行为

       通过set_terminate函数修改捕捉不住异常的默认处理器,从而使得发生捕捉不住的异常时,被自定义函数处理。

       void myTerminate(){...}

       set_terminate(myTerminate);    //其参数为 void(*)()


1.构造函数没有返回值,无法通过返回值来报告运行状态,所以只通过一种非函数机制的途径,即异常机制来解决构造函数的出错问题

2.异常机制与函数机制互不干涉,但捕捉的方式是基于类型匹配。捕捉相当于函数返回类型的匹配,而不是函数参数的匹配,所以捕捉不用考虑一个抛掷中有多种数据类型匹配问题

#include <iostream>
using namespace std;
class A{};
class B{};
int main(void)
{
    try
    {
        int j=0;
        double d=2.333;
        char *p = "aaaaaaaaaaaaaaaa";
        int key =0;
        cin>>key;
        switch (key)
        {
        case 1:
            throw j;
            break;
        case 2:
            throw d;
            break;
        case 3:
            throw p;
            break;
        case 4:
            throw A();
            break;
        case 5:
            throw B();
            break;
        default:
            break;
        }
    }
    catch(int)
    {
        cout<<"int exception\n"<<endl;
    }
    catch(double)
    {
        cout<<"double exception\n"<<endl;
    }
    catch(char*)
    {
        cout<<"char* exception\n"<<endl;
    }
    catch(A)
    {
        cout<<"class A exception\n"<<endl;
    }
    catch(B)
    {
        cout<<"class B exception\n"<<endl;
    }
    return 0;
}

catch代码必须出现在try后,并且在try块后可以出现多个catch代码块,以捕捉各种不同类型的抛掷。异常机制是基于这样的原理:程序运行实质上是数据实体在做一些操作(还要一句话这样描述的,程序只要两块一个是代码区一个是数据区),因此发生异常现象的地方,一定是某个实体出了差错,该实体所对应的数据类型便作为抛掷和捕捉的依据。

异常捕捉严格按照类型匹配(苛刻程度与模板的类型匹配媲美)

相关文章
|
Java
异常处理机制二
异常处理机制二
59 0
|
4天前
|
存储 UED 开发者
异常处理机制
异常处理机制
11 2
|
1月前
try...except异常处理
【10月更文挑战第16天】try except的一些异常处理方法
33 2
|
4月前
|
存储 算法 编译器
C++ 异常机制问题之Dwarf CFI是什么
C++ 异常机制问题之Dwarf CFI是什么
|
6月前
|
存储 C++
C++ 异常处理机制详解:轻松掌握异常处理技巧
C++ 异常处理提供结构化错误管理,增强程序健壮性。通过`throw`抛出异常,`try-catch`捕获并处理。示例展示了当年龄小于18时抛出异常。优点包括提高健壮性和代码可维护性,但可能降低性能并复杂化代码。另外,介绍了四种在C++中相加两个数的方法,包括使用运算符、函数、类、STL函数和lambda表达式。
70 0
|
6月前
|
安全 编译器 C++
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
C++从入门到精通:3.2异常处理——掌握C++的异常处理机制,提高程序健壮性
201 0
|
C#
C#异常处理
C#异常处理
62 0
|
6月前
|
存储 C++
63异常处理
63异常处理
33 0
|
Java 编译器 C++
C++异常处理
C++异常处理
37 0
|
安全 Java 程序员
JAVA异常处理(三种异常处理机制)
异常是程序在编译或执行的过程中可能出现的问题,语法错误不算在异常体系提前处理异常,程序会更加安全Error: 系统级别问题、JVM退出等,代码无法控制Exception: Java.lang包下,称为异常类,它表示程序本身可以处理的问题 Runtime Exception及其子类: 运行时异常,编译阶段不会报错(如空指针,数组索引越界异常) 除Runtime Exception之外所有异常:
100 0