C++程序 处理未检查的异常
异常是程序在执行过程中可能遇到的运行时错误或异常情况。
例子:
- 除以零
- 访问超出其边界的数组
- 内存耗尽
- 磁盘空间不足
异常的类型:
- 同步异常 :程序由于输入数据的某些故障而在运行中发生的异常。例如,溢出错误和除以零错误。
- 异步异常 :由程序无法控制的与程序无关的事件或故障引起的异常。例如,键盘故障和硬盘故障。
C++中的异常处理仅设计用于处理程序中的同步异常。异常处理的目标是创建一个检查并发送异常条件以执行适当代码的例程。该过程需要执行以下职责:
- 检测问题(发生异常)
- 告知错误检测(抛出异常)
- 接收错误信息(捕获异常)
- 采取纠正措施(处理异常)
关键字 try,throw和catch。 关键字 try 用于在可能产生异常的代码块之前。
try语句的语法:
try{
statement1;
statement2;
}
当发现异常时,将使用 throw 语句在try块中抛出异常。
throw语句的语法
throw(excep);
throw excep;
throw;//重新抛出异常
一个 catch 块由关键字‘ _catch _ ’定义异常,并相应地处理它。捕获异常的catch块必须紧随其后。
catch语句的语法:
try{
statement1;
statement2;
}
catch (argument)
{
statement3;// 执行的操作
}
当发现异常时,catch块的执行开始。catch语句可能或可能不包含异常类型的参数,这是可选的。当在catch中声明参数时,该参数可在catch块中使用。在执行catch块后,执行块内的行。如果未发现异常,则忽略catch块,并且如果发现不匹配,则程序将结束。
C++程序演示除零异常
// C++程序演示
//除以零的异常
#include <iostream>
using namespace std;
int main()
{
int Gfg1 = 9, Gfg2 = 0;
// 开始尝试块
try {
if (Gfg2 != 0)
cout << Gfg1 / Gfg2;
else
throw Gfg2; // 如果Gfg2为零,则抛出异常
}
// 开始捕获块
catch (int i) {
/// 如果b为零表示已经完成了除法操作
//在try块中抛出并接住
cout << "除以零:" << i << endl;
}
return 0;
}
输出:
除以零:0
C++ 程序演示数组下标超出范围异常
// C++程序演示 数组越界异常
#include <iostream>
using namespace std;
int main()
{
//用数字1~5初始化一个大小为5的数组
int a[5] = { 1, 2, 3, 4, 5 }, i;
// try块从这里开始
try {
i = 0; //将i初始化为0
// 循环打印数组的值,直到它的大小为5
while (1) {
if (i != 5) {
cout << a[i] << endl;
i++;
}
// 如果i超过5,那么抛出异常
else
throw i;
}
}
// 捕捉异常
catch (int i) {
cout << "数组越界异常: " << i
<< endl;
}
return 0;
}
输出结果:
1
2
3
4
5
数组越界异常: 5
C++程序抛出多个异常并定义多个捕捉语句
// C++程序抛出多个异常并定义多个捕捉语句
#include <iostream>
using namespace std;
// 检查数字是正数、负数还是0的函数
void num(int k)
{
try {
if (k == 0)
throw k; // 抛出整数值
else if (k > 0)
throw 'P'; // 抛出字符值
else if (k < 0)
throw 1.0; // 抛出双精度值
cout << "*** end of try block ***\n";
}
// 捕捉字符值
catch (char g) {
cout << "捕捉到正数\n";
}
// 捕捉整数值
catch (int j) {
cout << "捕捉到空值\n";
}
// 捕捉双精度值
catch (double f) {
cout << "捕捉到负数\n";
}
cout << "*** end of try catch ***\n \n";
}
int main()
{
cout << "多重捕捉的演示" << endl;
num(0); // 传递0调用函数
num(5); // 传递正数调用函数
num(-1); // 传递负数调用函数
return 0;
}
输出结果:
多重捕捉的演示
捕捉到空值
end of try catch
捕捉到正数
end of try catch
捕捉到负数
end of try catch