C++学习笔记-throw抛出异常
前言
在学习C++数据结构的过程中,常常会见到如下的代码块:
template <class T>
T LinkList<T>::Get( int i)
{ //初始化
Node<T> *p=first->next;
int j=1;
while (j!=i) && (p!=NULL)
{
p=p->next;
j++;
}
if(p==NULL) throw “位置非法”;
return p->data;
}
其中老师对于throw的解释是:如果满足条件,抛出异常。但在依样画葫芦后,却出现了以下的错误信息:
于是便对throw的具体用法产生了好奇,故作此文以记。
C++异常处理
在C++语言中,通常使用try,throw和catch语句去实现异常处理,示例如下:
#include <iostream>
using namespace std;
void ThrowError()
{
int a;
cin >> a;
if (a == 0) throw 1;
else if (a == 1) throw"字符串:输入的为1";
else throw 100;
cout << "throw后面的语句" << endl;
}
int main()
{
try
{
ThrowError();
}
catch (int e)
{
switch (e)
{
case 1:
cout << "输入的为0" << endl;
break;
default:
cout << "输入的既不是0也不是1" << endl;
break;
}
}
catch (const char* e)
{
cout << e << endl;
}
cout << "catch后的语句" << endl;
return 0;
}
运行效果:
接下来逐一解释各部分代码块
1. try{}
try后面跟着的括号内的语句是代码的保护段,如果程序按照正常的顺讯执行到try语句,则执行try语句的内容。 如果try语句正常执行,则跟在try语句后面的catch不被执行。转而执行try语句后跟着的最后一个catch语句之后执行程序。 相反,如果try语句不正常执行,则执行catch内的语句。
2. throw
throw的基本语法:
throw 表达式;//表达式可以是基本数据类型,也可以是类
通过该语句抛出异常。通过运行示例可以发现,在try语句块中,若成功抛出一个异常,则throw之后的语句都将不再被执行。
3. catch
如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行,执行完后再跳转到最后一个 catch 块后面继续执行。
如果抛出的异常没有被捕获,那么程序会立刻终止,出现前言所述的情况。
后记
throw抛出异常的做法在遇到需要动态申请和释放内存、涉及指针操作的时候,可以比较有效地发现如野指针,指针悬挂等问题。故此记录。