在 C++ 中,抛出异常(throwing an exception)是处理错误或异常情况的一种机制。通过使用 throw
关键字,你可以在程序运行时将某个错误情况或不期望的状态报告出去,并将控制权转交给对应的异常处理程序。
抛出异常的基本语法
要在 C++ 中抛出异常,可以使用 throw
关键字,后跟要抛出的对象。这个对象可以是基本类型、类的实例,甚至是指针。常见的抛出方式有:
throw expression;
- expression 是要抛出的异常对象。例如,可以抛出一个整数、一个字符串、或是一个自定义的异常类对象。
示例:抛出异常
以下是一些抛出异常的基本示例:
#include <iostream>
#include <stdexcept> // 包含标准异常类
void functionThatThrows() {
// 抛出整数类型的异常
throw 42;
// 抛出C字符串的异常
throw "An error occurred";
// 抛出标准库中的异常类对象
throw std::runtime_error("Runtime error occurred");
}
int main() {
try {
functionThatThrows();
} catch (int e) {
std::cout << "Caught an integer: " << e << std::endl;
} catch (const char* e) {
std::cout << "Caught a C-string: " << e << std::endl;
} catch (const std::exception& e) {
std::cout << "Caught a std::exception: " << e.what() << std::endl;
}
return 0;
}
解释
throw 42;
抛出一个整数异常。throw "An error occurred";
抛出一个 C 字符串异常。throw std::runtime_error("Runtime error occurred");
抛出一个标准库中的std::runtime_error
异常,这是一种用于报告运行时错误的标准异常类型。 runtime_error继承了exception类
这些异常通过 try
块捕获,并在 catch
块中处理。catch
块会根据异常的类型选择对应的处理程序。
自定义异常类
C++ 允许定义自己的异常类,并抛出它们:
#include <iostream>
#include <stdexcept>
class MyException : public std::exception {//继承异常类,重写其虚函数
public:
const char* what() const noexcept override {
return "My custom exception";
}
};
void functionThatThrows() {
throw MyException();
}
int main() {
try {
functionThatThrows();
} catch (const MyException& e) {
std::cout << "Caught a MyException: " << e.what() << std::endl;
}
return 0;
}
在这个示例中,我们定义了一个继承自 std::exception
的自定义异常类 MyException
,并在 what()
方法中返回一个错误消息。当该异常被抛出时,catch
块会捕获并处理它。
总结
- 抛出异常 使用
throw
关键字,后跟要抛出的对象。 - 捕获异常 使用
try-catch
结构,其中try
块包裹可能抛出异常的代码,catch
块处理捕获到的异常。 - 可以抛出任何类型的对象,包括基本类型、标准库的异常类,或者自定义异常类。
这种机制帮助你在遇到错误或不期望的情况时将控制权转移到专门的异常处理代码,从而提高程序的健壮性和可维护性。
查看源码可知: 默认抛出的是"Unknown exception" 如果异常没有被继承