一、异常概述
异常是指程序执行时出现的意外或异常情况,如除数为0,文件不存在等。这些异常导致程序无法正常执行,甚至崩溃。C++中提供了异常处理机制,能够在程序出现异常时进行捕获和处理,让程序更加健壮。
二、异常处理语句
C++中使用try-catch语句进行异常处理,通过捕获异常并在catch语句中进行相应处理,使程序在出现异常时能够继续执行。
try {
// 可能出现异常的代码块
} catch (ExceptionType e) {
// 异常处理代码
}
try语句块中包含可能会抛出异常的代码,当异常被抛出时,程序会跳转到catch语句中进行异常处理。ExceptionType为自定义类型,捕获指定类型的异常。catch语句可以有多个,分别处理不同类型的异常。
三、自定义异常
C++中可以自定义异常类型,用于区分不同的异常情况。自定义异常需要继承自std::exception类,并重载其what()方法,返回异常的描述信息。
class CustomException : public std::exception {
public:
const char* what() const throw() {
return "This is a custom exception";
}
};
在程序中抛出自定义异常:
try {
throw CustomException();
} catch (std::exception& e) {
std::cout << e.what() << std::endl; // 输出异常描述信息
}
四、异常传递
异常可以在函数间传递,用于在高层调用函数中处理异常。当函数中出现异常,程序跳转到调用函数中进行异常处理,继续将异常传递给调用函数,直到异常被处理或程序终止。
void func1() {
try {
func2(); // 调用函数2
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
throw; // 抛出异常
}
}
void func2() {
throw CustomException(); // 抛出自定义异常
}
在程序中调用函数1:
try {
func1(); // 调用函数1
} catch (std::exception& e) {
std::cout << e.what() << std::endl;
}
五、异常安全
在程序中,异常可能会导致资源没有释放或部分释放,造成资源泄露或错误。为了避免这种情况,可以使用异常安全的代码。
异常安全的代码分为三个级别,分别为:
- 基本异常安全(Basic exception safety):不会泄露资源,但程序状态可能已被修改。
- 强异常安全(Strong exception safety):程序状态和资源都不会发生改变。
- 不抛出异常保证(No-throw guarantee):不会发生异常。
为了实现强异常安全,可以使用RAII(资源获取即初始化)技术,将资源的分配和释放放在同一个类中进行,通过构造函数和析构函数来实现自动化管理。在异常发生时,调用析构函数自动释放资源。
class Test {
private:
int* ptr;
public:
Test() {
ptr = new int;
}
~Test() {
delete ptr;
}
};
在程序中使用RAII:
void func() {
Test t; // RAII资源管理类
// 可能抛出异常的代码
}
六、总结
通过C++异常处理机制,能够让程序在出现异常时进行捕获和处理,提高程序的健壮性。通过自定义异常类型和异常传递,能够进行更加详细的异常处理。在编写代码时,需要考虑到异常安全,避免资源泄露和错误。
原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/232545.html
微信扫一扫
支付宝扫一扫