C++学习第20课,异常

1 异常

一句话概括:捕获异常

1.1 谁捕获异常?捕获谁?

A捕获B

A()

{

   try{

    B();

}

}

1.1 谁制造了异常?

函数B

B()

{

    throw 某个对象

}

1.1 捕获后怎么处理?

随A怎么做

A()

{

try{

B();

}catch(类型 对象)

{

    //处理

}

}

2 函数B可能抛出多种异常

函数A中可有多个catch分支;

catch分支中,对于异常对象,先捕获派生类对象,再捕获基类对象,按此顺序排放代码;

未能捕获的异常,将继续抛给上一层的调用者

3 想知道函数B会抛出什么异常

3.1 函数B可以申明异常

void B(void) throw(int ,double,MyException)    //可以抛出一个类

void B(void) throw()//不会抛出任何异常

void B(void) throw(...)//可以抛出任何异常

3.2 如果抛出了意外的异常怎么办

3.2.1事先设置处理函数

#include

#include

using namespace std;

class MyException {

public:

virtual void what(void) { cout<<"This is MyException"<

};

class MySubException : public MyException{

void what(void) {cout<<"This is MySubException"<

};

void C(int i) throw(int, double)

{

int a = 1;

double b = 1.2;

float c = 1.3;

if(i == 0)

{

cout<<"In c,it is ok"<

}

else if (i == 1)

throw a;

else if (i == 2)

throw b;

else if (i == 3)

throw c;

else if (i == 4)

throw MyException();

else if (i == 5)

throw MySubException();

}

void B(int i)

{

cout<<"call C ..."<

C(i);

cout<<"after call C ..."<

}

void A(int i)

{

try {

B(i);

} catch (int j)

{

cout<<"catch int exception "<

} catch (MyException &e)

{

e.what();

}

catch (...)

{

//捕捉其他被声明的异常

cout<<"catch other exception"<

}

}

void my_unexpected_func () { cout<<"catch unexpected exception"<

int main(int argc, char **argv)

{

set_unexpected (my_unexpected_func);

int i;

if(argc != 2)

{

cout<<"Usage: "<

cout<"<

return -1;

}

i = strtoul(argv[1], NULL, 0);

A(i);

return 0;

}

3.2.2 对于意料之外的异常,会执行2个函数

"unexpected"函数(可以自己提供)未申明的异常时会调用

"terminate"函数(可以自己提供)用来处理catch分支未捕捉的异常

定义

void my_unexpected_func () { cout<<"catch unexpected exception"<

void my_terminate_func() {cout<<"my_terminate_func"<

调用

set_unexpected (my_unexpected_func);

set_terminate (my_terminate_func);

你可能感兴趣的:(C++学习第20课,异常)