C++异常类别

     最近在看C++的异常处理的有关知识,对异常类别的头文件,特加以说明:

(1)基础类别exception与bad_exception定义于<exception>;

(2)bad_alloc定义于<new>;

(3)bad_cast和bad_typeid定义于<typeinfo>;

(4)ios_base::failure定义于<ios>;

(5)其他异常类型定义于<stdexcept>。

### C++ 异常处理机制 C++异常处理是一种用于管理程序运行时错误的强大工具。它允许开发者通过 `try` 块监控潜在的错误区域,并使用 `catch` 块捕获并处理这些错误。此外,还可以通过 `throw` 关键字抛出异常,或者使用 `noexcept` 来声明某些函数不会抛出任何异常。 #### 1. try-catch 结构 当一段代码可能会引发异常时,可以将其放置在一个 `try` 块中。如果该块中的代码引发了异常,则会跳转到相应的 `catch` 块进行处理。 以下是基本语法结构: ```cpp try { // 可能引发异常的代码 } catch (ExceptionType& e) { // 处理特定类型的异常 } ``` #### 2. 抛出异常 (`throw`) 可以通过 `throw` 表达式显式地抛出一个异常对象。这个表达式的参数通常是一个具体的异常类型实例。 示例代码如下: ```cpp void checkAge(int age) { if (age < 0 || age > 120) { throw std::invalid_argument("Invalid age value"); } } int main() { try { int user_age = -5; checkAge(user_age); std::cout << "Valid age entered." << std::endl; } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0; } ``` 在此示例中,如果输入年龄小于零或大于一百二十岁,将会触发 `std::invalid_argument` 类型的异常[^1]。 #### 3. noexcept 规范 为了提高性能优化的可能性,可以在函数定义前加上 `noexcept` 关键词表明此函数不应该抛出任何异常。这有助于编译器做出更激进的优化决策。 例如: ```cpp double divide(double a, double b) noexcept { if (b == 0) { // 如果违反了 noexpect 承诺则调用 terminate() std::terminate(); } return a / b; } ``` 在这里,即使除数为零的情况发生也不会主动抛出异常而是直接终止程序执行流程。 #### 4. 自定义异常类 除了标准库提供的异常类别外,也可以创建自己的异常子类以便更好地描述具体场景下的问题所在。 下面展示如何自定义一个新的异常类型: ```cpp class NegativeNumberException : public std::runtime_error { public: explicit NegativeNumberException(const char* message) : std::runtime_error(message) {} }; void processPositiveNumbers(int number) { if (number < 0) { throw NegativeNumberException("Negative numbers are not allowed."); } } ``` 上述片段展示了怎样继承自 `std::runtime_error` 并重载其构造函数来传递定制化消息给父级实现。 --- ### 总结 C++ 提供了一个灵活而强大的异常处理框架,使开发人员能够在面对复杂逻辑和不可预见情况时保持应用程序稳定性和可维护性。合理运用 `try`, `catch`, `throw` 和 `noexcept` 是构建高质量软件不可或缺的一部分。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值