PPC的C/C++和人工智能学习笔记
每一篇学习笔记,都只是为了更好地掌握和理解

C++语言基础(13)_异常处理

今天学习C++语言基础的异常处理。

 

异常:程序运行中出现的某些错误不可避免,但是我们可以预料。比如tcp连接中断了,比如用户输入的数据不符合我们的规定,比如除数为0了等等。但是对于比如下标越界等错误,其实是因为程序员的问题引起的,此时建议不要处理,直接进行保存数据等操作然后报错结束程序。

 

try :专门捕获异常,把异常传递给catch

catch块 :处理异常

throw :抛出异常

 

throw 后面可以跟任意表达式,代表throw所抛出的异常,抛出的异常为表达式的值

比如 throw 1;

可以认为异常可以是任意类型。

 

例子:

try //try块,用于监视运行时可能出现的异常代码(必须用{})

{

if (0)

throw 1 < 2;

//监视异常,所有可能产生异常的代码在这里被监视

}

//catch块序列,由一个或多个catch块组成,作用是去匹配try传递过来的异常类型

catch (int i)

{

cout << i << endl;

}

catch (char c)

{

cout << c << endl;

}

catch (bool b)

{

cout << “bool” << endl;

}

异常的处理次序:

#include <iostream>
using namespace std;
void inDate();
void f(int v);

class MyExcp{}; //自定义的异常类

void inDate()
{
 int val;
 cin >> val;
 if (val == 0)
 throw "value = 0";//当前层级无法监控到的异常,往上级抛出
 try
 {
 if (val < -50)// 当前层级有监控,但当前catch块无法处理,继续往上级抛出
 {
 MyExcp me;
 throw me;
 }
 if (val > 50)//当前有监控,也有处理,本级处理
 {
 throw "value > 50";
 }
 else
 {
 f(val);
 }
 }
 catch (int i)
 {
 cout << "indate::int异常" << endl;
 }
 catch (char *srt)
 {
 cout << "indate::char*异常" << endl;
 }
 //不管哪层的catch块处理完异常,代码无法回到抛出异常的那个地方。代码会沿catch块序列
 //的最后一行继续往下执行
}

void f(int v)
{
 //int *p = new int[4];危险代码,下面异常抛出后不会再回来释放动态内存
 if (v == 11)
 throw v;
 if (v == 22)
 throw 3.13;
 //delete[]p; //这里在异常出现以后就不会再执行到了。
}

int main() {
 try//异常抛到最上层,一直没有被处理,调用abort()函数异常结束程序
 {
 inDate();
 } 
 catch (char *str)
 {
 cout << "Main::char*异常" << endl;
 }
 catch (MyExcp m)
 {
 cout << "Main::类异常" << endl;
 }
 return 0;
}

内存分配异常的例子:(系统定义的异常类)

struct MyArr

{

int arr[20000];

};

int main()

{

//exception

try

{

MyArr *pn = new MyArr[19000];

}

catch (std::bad_alloc& e)

{

cout << “发生异常” << e.what() << endl;

}

}

 

 

 

(2017-04-02 www.vsppc.com)

学习笔记未经允许不得转载:PPC的C/C++和人工智能学习笔记 » C++语言基础(13)_异常处理

分享到:更多 ()

评论 抢沙发

评论前必须登录!