主题
try-catch-finally
C++ 的异常处理机制通过 try
、catch
和 throw
关键字来捕捉和处理运行时错误。尽管 C++ 中并没有内建 finally
语句,但可以通过一些技巧模拟类似行为。在本节中,我们将学习如何使用 try-catch
进行异常处理,并探索如何模拟 finally
的功能。
异常处理流程
异常处理分为三个步骤:
try
块:包含可能抛出异常的代码。catch
块:捕获并处理异常。throw
语句:用于抛出异常。
基本用法
cpp
#include <iostream>
#include <stdexcept>
int divide(int a, int b) {
if (b == 0) {
throw std::invalid_argument("Division by zero is not allowed.");
}
return a / b;
}
int main() {
try {
int result = divide(10, 0); // 可能抛出异常
std::cout << "Result: " << result << std::endl;
} catch (const std::invalid_argument& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,divide()
函数会抛出一个 std::invalid_argument
异常。当除数为零时,catch
块捕获并处理了这个异常。
模拟 finally
语句
虽然 C++ 中没有原生的 finally
语句,但可以使用资源管理类(如 RAII)或者 try-catch
配合析构函数来模拟 finally
的功能。
使用 RAII 模拟 finally
cpp
#include <iostream>
class Resource {
public:
Resource() {
std::cout << "Resource acquired!" << std::endl;
}
~Resource() {
std::cout << "Resource released!" << std::endl;
}
};
void functionWithException() {
Resource res;
throw std::runtime_error("Something went wrong!");
}
int main() {
try {
functionWithException(); // 可能抛出异常
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
在此示例中,Resource
类的析构函数将在 try
块抛出异常后自动调用,从而模拟 finally
语句的资源释放行为。
总结
try
:用于包装可能抛出异常的代码。catch
:用于捕获并处理特定的异常类型。- C++ 并不支持
finally
,但通过 RAII 或自定义资源管理机制,能够有效模拟其功能。