📅  最后修改于: 2023-12-03 14:39:56.746000             🧑  作者: Mango
在C++中,抛出异常是一种错误处理机制。当程序遇到无法处理的错误情况时,可以使用 throw
表达式抛出异常。当异常被抛出时,程序将跳到最近匹配的 catch
块,如果没有匹配的 catch
块,则程序将终止并打印出错信息。
通过 throw
表达式可以抛出一个异常,并指定抛出的异常类型,语法如下:
throw exception_type;
其中 exception_type
可以是任何类型(包括内置类型、自定义类型等),通常是从 std::exception
派生而来的异常类。例如:
throw std::runtime_error("Something went wrong.");
上述代码抛出了一个 std::runtime_error
类型的异常,并且传递了一个错误信息。
一旦抛出异常,程序将查找最近的匹配的 catch
块,并将异常传递给该块进行处理。一个 catch
块的语法如下:
try {
// 可能抛出异常的代码
} catch (exception_type1 exception_variable1) {
// 处理类型为 exception_type1 的异常
} catch (exception_type2 exception_variable2) {
// 处理类型为 exception_type2 的异常
} catch (...) {
// 处理所有未被匹配的异常
}
其中,exception_type
指定了要捕获的异常类型,exception_variable
是一个变量名,用于保存捕获的异常对象。catch (...)
是一个特殊的块,用于捕获任何未被匹配的异常。
以下是一个示例:
try {
int x = 0;
int y = 1 / x; // 引发除以零错误
} catch (std::exception& e) {
std::cout << "Exception caught: " << e.what() << std::endl;
}
上述代码将抛出一个 std::exception
类型的异常,并将其捕获并输出错误信息。注意到 catch
块中使用了一个 std::exception&
类型的引用,这是因为 std::exception
是一个抽象基类,所有的标准异常类(如 std::runtime_error
、std::logic_error
等)都是从它派生而来的。
除了使用标准异常类以外,我们还可以自定义异常类来抛出和捕获更加具体的异常。自定义异常类需要从 std::exception
派生,并实现 what()
函数返回异常信息。以下是一个自定义异常类的示例:
class MyException : public std::exception {
public:
MyException(const char* message) : msg(message) {}
const char* what() const noexcept override {
return msg.c_str();
}
private:
std::string msg;
};
上述代码定义了一个 MyException
类,它接受一个错误信息字符串,并重载了 what()
函数以返回这个字符串。
若要抛出自定义异常,只需将异常对象传递给 throw
表达式即可:
if (x < 0) {
throw MyException("x must be non-negative.");
}
C++中的异常处理机制为我们提供了一种便捷的方式来处理错误情况。使用 throw
表达式可以抛出任何类型的异常,而使用 catch
块可以在出现异常时捕获并处理它们。同时,我们也可以自定义异常类以增强异常处理的具体性。