在C++中,异常处理是通过抛出(throw)和捕获(catch)异常来实现的。异常通常用于处理在程序运行过程中发生的错误或其他异常情况,使得程序能够以一种有序的方式处理这些问题,而不是立即崩溃。
抛出异常
要抛出一个异常,可以使用throw
关键字,后面跟着要抛出的异常对象。异常对象可以是任意类型的,但通常是类对象,特别是标准库中的异常类(如std::exception
)或用户自定义的异常类。
#include <iostream>
#include <stdexcept> // 包含标准异常类
void mightGoWrong() {
bool error1Detected = true;
bool error2Detected = false;
if (error1Detected) {
throw std::runtime_error("Error 1 occurred");
}
if (error2Detected) {
throw std::logic_error("Error 2 occurred");
}
}
int main() {
try {
mightGoWrong();
} catch (const std::runtime_error& e) {
std::cerr << "Caught a runtime error: " << e.what() << std::endl;
} catch (const std::logic_error& e) {
std::cerr << "Caught a logic error: " << e.what() << std::endl;
} catch (...) {
std::cerr << "Caught an unknown error." << std::endl;
}
return 0;
}
解释
- 抛出异常:在
mightGoWrong
函数中,根据条件抛出不同类型的异常(std::runtime_error
和std::logic_error
)。 - 捕获异常:在
main
函数中,使用try-catch
块来捕获可能抛出的异常。- 第一个
catch
块捕获并处理std::runtime_error
类型的异常。 - 第二个
catch
块捕获并处理std::logic_error
类型的异常。 - 最后的
catch(...)
是一个通用的捕获块,用于捕获所有未被前面块捕获的异常。
- 第一个
自定义异常类
你也可以定义自己的异常类,通过继承std::exception
或其他标准异常类来实现。
#include <iostream>
#include <exception>
#include <string>
class MyException : public std::exception {
public:
MyException(const std::string& message) : msg_(message) {}
virtual const char* what() const noexcept override {
return msg_.c_str();
}
private:
std::string msg_;
};
void mightGoWrong() {
throw MyException("Something went wrong!");
}
int main() {
try {
mightGoWrong();
} catch (const MyException& e) {
std::cerr << "Caught a MyException: " << e.what() << std::endl;
} catch (const std::exception& e) {
std::cerr << "Caught an exception: " << e.what() << std::endl;
}
return 0;
}
hat
方法来提供异常的具体信息。然后在mightGoWrong
函数中抛出这个自定义异常,并在main
函数中捕获并处理它。
通过这种方式,C++的异常处理机制提供了一种强大且灵活的错误处理策略,有助于编写更健壮和易于维护的代码。