C++-throw抛出异常

前言

         在学习C++数据结构的过程中,常常会见到如下的代码块:

1
2
3
4
5
6
7
8
9
10
11
12
13
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语句去实现异常处理,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#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的基本语法:

1
throw 表达式;//表达式可以是基本数据类型,也可以是类

         通过该语句抛出异常。通过运行示例可以发现,在try语句块中,若成功抛出一个异常,则throw之后的语句都将不再被执行。

3. catch
         如果 try 块执行的过程中拋出了异常,那么拋出异常后立即跳转到第一个“异常类型”和拋出的异常类型匹配的 catch 块中执行,执行完后再跳转到最后一个 catch 块后面继续执行。
         如果抛出的异常没有被捕获,那么程序会立刻终止,出现前言所述的情况。

后记

         throw抛出异常的做法在遇到需要动态申请和释放内存、涉及指针操作的时候,可以比较有效地发现如野指针,指针悬挂等问题。故此记录。

打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lgc0208@foxmail.com
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信