【每日 C/C++ 问题】

阅读 18

2024-11-18

一、C++ 中的异常处理机制是怎样的?

        C++ 中的异常处理机制是用于处理运行时错误的一种强大工具,它允许程序在发生异常时保持正常的控制流,而不是直接终止程序。这种机制通过 trycatch 和 throw 关键字来实现。

try: 用于定义可能抛出异常的代码块。

catch():用于捕获异常并处理它。每个 catch 块与相应的 try 块相连,并且可以处理特定类型的异常。

exception:是所有异常的基类

throw:用于抛出异常。可以是任何类型的对象

示例1:

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


int main() {
	vector<int> vec = { 1,2,3,4 };

	try
	{
		vec.at(6);
	}
	catch (exception& e)
	{
		cout << e.what();
	}
}

输出:

invalid vector<T> subscript

示例2:

        异常被上面的 catch 接收就不会执行下面的 catch,所以 catch (exception &e)往往放在最后,因为他什么类型的异常都能接收,抛出异常之后代码不会因为这个错误而终止会继续进行---异常可以帮助我们快速锁定错误位置且不影响程序的整个执行

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


int main() {
	vector<int> vec = { 1,2,3,4 };

	try
	{
		vec.at(6); // at函数如果参数越界就会抛出out_of_range类型的异常
	}
	catch (out_of_range &e)
	{
		cout << 1 << endl;
		cout << e.what() << endl;
	}
	catch (exception &e) // exception 是所有异常基类此处是多态父类引用指向子类对象
	{
		cout << 1 << endl;
		cout << e.what() << endl;
	}
	cout << "hhh"; // 抛出异常不会结束程序
}

输出:

1
invalid vector<T> subscript
hhh

自定义异常类:

#include<iostream>
using namespace std;
#include<string>
// 自定义异常类

class MyException
{
private:
	string msg;
public:
	MyException(string str) : msg(str) {}
	MyException(const MyException& other)
	{
		this->msg = other.msg;
		cout << "拷贝构造函数" << endl;
	}
	void what()
	{
		cout << msg << endl;
	}
};
int fun(int a, int b)
{
	if (b == 0)
	{
		MyException m("-----异常:除数不能为0----"); //创建对象
		throw m; // 抛出异常
	}
	cout << "函数抛出异常就会被结束" << endl;
	return a / b;
}
int main() 
{
	try
	{
		fun(1, 0);
	}
	catch (MyException &e) // catch 捕获 throw 抛出的异常
	{
		e.what(); // 执行异常的信息输出
	}
	cout << "程序执行没有被终止";
}

输出

拷贝构造函数
-----异常:除数不能为0----
程序执行没有被终止

二、什么情况下应该使用异常处理?异常处理的优缺点是什么?

不可预见的错误:当程序运行时可能遇到无法预见的错误,例如文件未找到、网络连接失败、数据库连接错误等。
输入验证:当用户输入的数据可能不符合预期格式或范围时,可以使用异常处理来捕获和处理这些错误。
资源管理:在涉及资源(如文件、数据库连接、网络连接等)的操作时,异常处理可以确保资源在发生错误时能够被正确释放。

异常处理的优点

提高代码的健壮性:通过捕获和处理异常,可以防止程序因错误而崩溃,提高程序的稳定性。
便于调试:异常可以携带错误信息,帮助开发人员快速定位问题。
 

异常处理的缺点
性能开销:异常处理可能会引入一定的性能开销,尤其是在频繁抛出和捕获异常的情况下。
过度使用:过度依赖异常处理可能导致代码混乱,增加理解和维护的难度。

精彩评论(0)

0 0 举报