一、C++ 中的异常处理机制是怎样的?
C++ 中的异常处理机制是用于处理运行时错误的一种强大工具,它允许程序在发生异常时保持正常的控制流,而不是直接终止程序。这种机制通过 try
, catch
和 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----
程序执行没有被终止
二、什么情况下应该使用异常处理?异常处理的优缺点是什么?
不可预见的错误:当程序运行时可能遇到无法预见的错误,例如文件未找到、网络连接失败、数据库连接错误等。
输入验证:当用户输入的数据可能不符合预期格式或范围时,可以使用异常处理来捕获和处理这些错误。
资源管理:在涉及资源(如文件、数据库连接、网络连接等)的操作时,异常处理可以确保资源在发生错误时能够被正确释放。
异常处理的优点
提高代码的健壮性:通过捕获和处理异常,可以防止程序因错误而崩溃,提高程序的稳定性。
便于调试:异常可以携带错误信息,帮助开发人员快速定位问题。
异常处理的缺点
性能开销:异常处理可能会引入一定的性能开销,尤其是在频繁抛出和捕获异常的情况下。
过度使用:过度依赖异常处理可能导致代码混乱,增加理解和维护的难度。