C++标准异常类主要包括std::exception
及其派生类,它们用于在程序中处理异常情况。以下是一些常见的使用场景:
- 错误处理:当程序遇到不可恢复的错误时,可以抛出异常。例如,文件打开失败、内存分配失败等。
#include
#include
#include
int main() {
std::ifstream file("non_existent_file.txt");
if (!file) {
throw std::runtime_error("Unable to open file");
}
// 正常处理文件的代码
return 0;
}
- 输入验证:在处理用户输入或外部数据时,可以使用异常来确保数据的合法性。
#include#include int main() { int age; std::cout << "Enter your age: "; std::cin >> age; if (age < 0) { throw std::invalid_argument("Age cannot be negative"); } // 正常处理年龄的代码 return 0; }
- 资源管理:在C++中,可以使用异常来确保资源的正确释放。例如,当
new
操作失败时,会抛出std::bad_alloc
异常。
#include#include int main() { try { int* largeArray = new int[1000000]; // 使用数组的代码 delete[] largeArray; } catch (const std::bad_alloc& e) { std::cerr << "Memory allocation failed: " << e.what() << std::endl; } return 0; }
- 自定义异常类:可以根据需要创建自定义异常类,以便更精确地表示特定的错误情况。
#include#include class FileFormatError : public std::runtime_error { public: FileFormatError(const std::string& message) : std::runtime_error(message) {} }; int main() { try { // 读取文件并检查格式 if (!fileFormatValid) { throw FileFormatError("Invalid file format"); } } catch (const FileFormatError& e) { std::cerr << "File format error: " << e.what() << std::endl; } return 0; }
- 异常传播:在复杂的程序中,可以使用异常来传播错误,以便在更高的层次上处理异常。
#include#include class NetworkError : public std::runtime_error { public: NetworkError(const std::string& message) : std::runtime_error(message) {} }; class ServerError : public NetworkError { public: ServerError(const std::string& message) : NetworkError(message) {} }; int main() { try { // 尝试连接服务器 if (!connectToServer()) { throw ServerError("Failed to connect to server"); } } catch (const ServerError& e) { std::cerr << "Server error: " << e.what() << std::endl; } return 0; }
总之,C++标准异常类提供了一种灵活的方式来处理程序中的异常情况,有助于提高代码的健壮性和可维护性。