亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

C++ 异常处理:Try、Catch、throw 示例

什么是 C++ 中的异常处理?

C++ 中的异常处理为您提供了一种处理意外情况(如运行时错误)的方法。因此,每当发生意外情况时,程序控制就会转移到称为处理程序的特殊功能。

要捕获异常,您可以将某些代码段置于异常检查之下。这段代码放在 try-catch 块中。

如果该段代码中出现异常情况,就会抛出异常。接下来,异常处理程序将接管程序的控制权。

如果没有异常情况发生,代码将正常执行。处理程序将被忽略。

在本 C++ 教程中,您将学习:

为什么要处理异常?

以下是在 C++ 中使用异常处理的原因:

异常处理关键字

C++ 中的异常处理围绕着这三个关键字展开:

假设代码块将引发异常。异常将被使用 try 和 catch 关键字的方法捕获。 try/catch 块应该围绕可能引发异常的代码。这样的代码被称为受保护的代码。

语法:

try/catch 采用这种语法:

try {
   // the protected code
} catch( Exception_Name exception1 ) {
   // catch block
} catch( Exception_Name exception2 ) {
   // catch block
} catch( Exception_Name exceptionN ) {
   // catch block
}

示例 1:

#include<iostream>
#include<vector>
using namespace std;

int main() {
	vector<int> vec;
	vec.push_back(0);	
	vec.push_back(1);	
	// access the third element, which doesn't exist
	try
	{
		vec.at(2);		
	}
	catch (exception& ex)
	{
		cout << "Exception occurred!" << endl;
	}
	return 0;
}

输出:

下面是代码截图:

代码说明:

  1. 在程序中包含 iostream 头文件以使用其功能。
  2. 在程序中包含矢量头文件以使用其功能。
  3. 将程序中的 std 命名空间包含到它的类中而不调用它。
  4. 调用 main() 函数。程序逻辑应添加到其主体中。
  5. 创建一个名为 vec 的向量来存储整数数据。
  6. 将元素 0 添加到名为 vec 的向量中。
  7. 将元素 1 添加到名为 vec 的向量中。
  8. 评论。它将被 C++ 编译器跳过。
  9. 使用 try 语句捕获异常。 { 标记 try/catch 块主体的开始。在正文中添加的代码将成为受保护的代码。
  10. 尝试访问存储在名为 vec 的向量的索引 2(第三个元素)处的元素。该元素不存在。
  11. try/catch 块的主体结束。
  12. 捕捉异常。返回的错误信息将存储在变量 ex 中。
  13. 如果捕获到异常,则在控制台上打印一些消息。
  14. catch 块主体的结尾。
  15. 程序应在成功执行后返回一个值。
  16. main() 函数体结束。

示例 2:

#include <iostream>
using namespace std;
double zeroDivision(int x, int y) {

	if (y == 0) {
		throw "Division by Zero!";
	}
	return (x / y);
}

int main() {
	int a = 11;
	int b = 0;
	double c = 0;

	try {
		c = zeroDivision(a, b);
		cout << c << endl;
	}
	catch (const char* message) {
		cerr << message << endl;
	}
	return 0;
}

输出:

下面是代码截图:

代码说明:

  1. 在程序中包含 iostream 头文件以使用其功能。
  2. 将程序中的 std 命名空间包含到它的类中而不调用它。
  3. 创建一个名为 zeroDivision 的函数,它接受两个整数参数 x 和 y。该函数应返回双精度结果。
  4. 使用 if 语句检查变量参数 y 的值是否为 0。{ 标记 if 正文的开始。
  5. y 为 0 时返回/抛出的消息。
  6. if 语句主体的结尾。
  7. zeroDivision 函数应返回 x/y 的值。
  8. zeroDivision 函数主体的结尾。
  9. 调用 main() 方法。 { 标记此方法的开始。
  10. 声明一个整型变量并将其赋值为 11。
  11. 声明一个整数变量 b 并将其赋值为 0。
  12. 声明一个双变量 c 并将其赋值为 0。
  13. 使用 try 语句捕获异常。 { 标记 try/catch 块主体的开始。在正文中添加的代码将成为受保护的代码。
  14. 调用 zeroDivision 函数并传递给参数 a 和 b,即 11 和 0。此操作的结果将存储在变量 c 中。
  15. 在控制台打印出变量 c 的值。
  16. try/catch 块的主体结束。
  17. 捕捉异常。返回的错误信息将存储在变量 message 中。
  18. 在控制台打印返回的错误信息。
  19. catch 块主体的结尾。
  20. 程序应在成功执行后返回一个值。
  21. main() 函数体结束。

C++ 标准异常

C++ 附带了在 类中定义的标准异常列表。这些描述如下:

异常 说明 std::exception 这是一个异常,是所有标准 C++ 异常的父类。std::bad_alloc 这个异常是由一个新的关键字引发的。std::bad_cast 这是一个由 dynamic_cast 引发的异常。std::bad_exception 处理意外异常的有用设备在 C++ 程序中。std::bad_typeidtypeid 引发的异常。std::logic_error 这个异常理论上可以通过阅读代码检测到。std::domain_error 这是使用数学上无效的域后引发的异常。std::invalid_argument 使用无效参数引发的异常.std::length_error创建大std::string后抛出的异常。std::out_of_range由at方法抛出。std::runtime_error这是一个无法通过读取代码检测到的异常。std::overflow_error这个异常在发生后抛出数学上的溢出。std::range_error 当你试图存储一个超出范围的值时抛出这个异常。std::underflow_error 出现 m 后抛出的异常主题下溢。

用户定义的异常

C++ std::exception 类允许我们定义可以作为异常抛出的对象。此类已在 标头中定义。该类为我们提供了一个名为 what 的虚拟成员函数。

此函数返回 char * 类型的以空字符结尾的字符序列。我们可以在派生类中覆盖它以获得异常描述。

示例:

#include <iostream>
#include <exception>
using namespace std;

class newException : public exception
{
	virtual const char* what() const throw()
	{
		return "newException occurred";
	}
} newex;

int main() {

	try {
		throw newex;
		}
	catch (exception& ex) {
		cout << ex.what() << '\n';
	}
	return 0;	
}

输出:

下面是代码截图:

代码说明:

  1. 在我们的程序中包含 iostream 头文件。我们将使用它的功能而不会出错。
  2. 在我们的程序中包含异常头文件。我们将使用它的功能,就像没有错误一样。
  3. 在我们的程序中包含 std 命名空间以使用它的类而不调用它。
  4. 创建一个名为 newException 的新类。这个类继承了C++的异常类。
  5. 类主体的开头。
  6. 覆盖异常头文件中定义的虚成员函数what()。然后我们将描述我们自己的异常,即新异常。
  7. 开始新异常的定义。
  8. 捕获到新异常时返回的消息。
  9. 新异常的定义结束。
  10. 类 newException 的主体结束。 newex 是用于捕获新异常的名称,之后将调用 newException。
  11. 调用 main() 函数。程序逻辑应添加到其主体中。 { 标志着它的主体的开始。
  12. 使用 try 语句来标记我们需要在其中标记异常的代码。 { 标记 try/catch 块主体的开始。被它包围的代码将受到保护。
  13. 如果捕获到 newex 异常,则抛出它。
  14. try 正文结束。
  15. 使用 catch 语句捕获异常。异常错误消息将存储在变量 ex 中。
  16. 在控制台上打印异常错误消息。
  17. catch 语句主体的结尾。
  18. 如果程序执行成功,它应该返回一个值。
  19. main() 函数体的结尾。

总结:


C语言

  1. C++ 注释
  2. Python 异常处理使用 try、except 和 finally 语句
  3. Java 异常处理
  4. Java 尝试...捕获
  5. C++ 中的运算符示例:什么是、类型和程序
  6. 带有示例的 C++ Switch Case 语句
  7. C++ 动态分配数组的例子
  8. C++ 结构与示例
  9. C++ 中的 std::list 示例
  10. 结构和类的区别:用 C++ 示例解释
  11. 15 个最佳 C++ IDE:免费 Windows 编辑器编译器 | 2021
  12. Python 异常处理:try、catch、finally 和 raise [示例]