在C++中,异常处理(Exception Handling)是一种用于处理程序运行时错误的机制。通过异常处理,程序可以在遇到错误时优雅地恢复或终止,而不是直接崩溃。C++中的异常处理主要通过try
、catch
和throw
关键字来实现。
try
块try
块用于包含可能会抛出异常的代码。如果在try
块中的代码抛出了异常,程序会立即跳转到与之匹配的catch
块。
try {
// 可能会抛出异常的代码
}
catch
块catch
块用于捕获并处理异常。每个catch
块可以捕获特定类型的异常。当try
块中的代码抛出异常时,程序会查找与异常类型匹配的catch
块,并执行其中的代码。
catch (ExceptionType& e) {
// 处理异常的代码
}
throw
语句throw
语句用于抛出异常。你可以抛出任何类型的异常,包括基本类型、对象或指针。
throw SomeException("An error occurred");
throw
可以在任何地方抛出异常,但只有在try
块中抛出的异常才会被对应的catch
块捕获。如果异常在try
块之外抛出,且没有被捕获,程序会调用std::terminate
,导致程序终止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | /**************************************************************** * 代码作者: Alex Li * 创建时间: 2025-03-03 04:56:07 * 最后修改: 2025-03-03 05:21:05 * 文件描述: C++异常处理 ****************************************************************/ #include <iostream> #include <stdexcept> using namespace std; // divide 函数用于执行除法运算,如果除数为零则抛出异常 double divide(double a, double b) { if (b == 0) { // 如果除数为零,抛出 invalid_argument 异常 throw invalid_argument("Division by zero is not allowed"); } return a / b; // 返回除法结果 } int main() { double a = 10.0; double b = 0.0; try { // 尝试执行除法运算 double result = divide(a, b); cout << "Result: " << result << endl; // 输出结果 } catch (const invalid_argument& e) { // 捕获 invalid_argument 异常并输出错误信息 cerr << "Error: " << e.what() << endl; } catch (...) { // 捕获所有其他类型的异常并输出通用错误信息 cerr << "An unknown error occurred" << endl; } return 0; // 返回 0 表示程序正常结束 } |
divide
函数在除数为零时抛出一个std::invalid_argument
异常。main
函数中的try
块调用divide
函数,并捕获可能抛出的异常。std::invalid_argument
异常,程序会输出错误信息。catch (...)
用于捕获所有类型的异常,通常用于处理未知异常。C++标准库提供了一些内置的异常类,它们都继承自std::exception
。常见的标准异常类包括:
std::runtime_error
:运行时错误。std::invalid_argument
:无效的参数。std::out_of_range
:超出范围。std::bad_alloc
:内存分配失败。你可以通过继承std::exception
类来创建自定义异常类。
#include <iostream>
#include <exception>
class MyException : public std::exception {
public:
const char* what() const noexcept override {
return "My custom exception occurred";
}
};
int main() {
try {
throw MyException();
} catch (const MyException& e) {
std::cerr << "Caught: " << e.what() << std::endl;
}
return 0;
}
catch
块中正确处理异常,避免资源泄漏。通过合理地使用异常处理机制,你可以编写出更加健壮和可靠的C++程序。