📜  c++中抛出了什么(1)

📅  最后修改于: 2023-12-03 14:39:56.746000             🧑  作者: Mango

C++中抛出了什么

在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_errorstd::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 块可以在出现异常时捕获并处理它们。同时,我们也可以自定义异常类以增强异常处理的具体性。