在C++中,异常处理是通过关键字try、catch和throw实现的。这种机制允许程序在运行时检测和处理错误,而不是在编译时。以下是C++异常处理的基本概念和使用方法:
#include <iostream>
#include <stdexcept>
int main() {
try {
// 可能抛出异常的代码
throw std::runtime_error("An error occurred");
} catch (const std::runtime_error& e) {
// 捕获并处理std::runtime_error类型的异常
std::cerr << "Caught exception: " << e.what() << std::endl;
} catch (...) {
// 捕获所有其他类型的异常
std::cerr << "Caught an unknown exception" << std::endl;
}
return 0;
}
你可以为不同类型的异常提供多个catch块:
try {
// 可能抛出异常的代码
throw std::runtime_error("An error occurred");
} catch (const std::runtime_error& e) {
std::cerr << "Caught runtime_error: " << e.what() << std::endl;
} catch (const std::logic_error& e) {
std::cerr << "Caught logic_error: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Caught an unknown exception" << std::endl;
}
你可以使用throw关键字抛出异常:
void divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero");
}
return a / b;
}
int main() {
try {
divide(10, 0);
} catch (const std::runtime_error& e) {
std::cerr << "Caught exception: " << e.what() << std::endl;
}
return 0;
}
在C++11之前,可以使用异常规范来指定函数可能抛出的异常类型。然而,这种做法在C++11中被弃用,并在C++17中被移除。推荐使用noexcept关键字来指定函数是否可能抛出异常。
void divide(int a, int b) noexcept(false) {
if (b == 0) {
throw std::runtime_error("Division by zero");
}
return a / b;
}
通过合理使用C++的异常处理机制,可以提高程序的健壮性和可维护性。