前言 在阅读别人开发的项目中,也许你会经常看到了多处使用异常的代码,也许你也很少遇见使用异常处理的代码。那在什么时候该使用异常,又在什么时候不该使用异常呢?在学习完异常基本概念和语法之后,后面会有讲解。 (1)异常抛出和捕捉语句 //1.抛出异常 throw 异常对象 //2.异常捕捉 try{ 可能会发生异常的代码 }catch(异常对象){ 异常处理代码 } throw子句:throw 子句用于抛出异常,被抛出的异常可以是C++的内置类型(例如: throw int(1);),也可以是自定义类型。 try区段:这个区段中包含了可能发生异常的代码,在发生了异常之后,需要通过t C++异常处理是一种机制,用于在程序运行时处理意外情况,比如当某个操作无法完成或者检测到不合法的状态时。异常处理使得程序可以优雅地处理错误,而不必在每个可能出现问题的地方都设置复杂的条件判断。 异常的基本语法由三部分组成:抛出(throw)、尝试(try)和捕获(catch)。在C++中,`throw` 语句用于抛出一个异常,可以是内置类型,如整型或浮点型,也可以是自定义的对象。例如,`throw int(1);` 将抛出一个整型异常。抛出异常后,当前函数的执行会被中断,控制流会立即跳转到最近的包含相应 `try` 块的代码段。 `try` 区段包围了可能抛出异常的代码。如果在 `try` 块内发生异常,程序会立即跳转到相应的 `catch` 子句,尝试找到匹配的异常类型来处理。`catch` 语句后面跟着异常对象的类型,用于指定要捕获的异常类型。例如,`catch (int i)` 会捕获所有类型的整型异常。注意,`catch` 参数通常使用引用传递,以避免复制异常对象并保持对象的多态性。 异常处理有几条重要的规则: 1. 抛出的异常类型必须与捕获的异常类型匹配。这意味着,如果你抛出一个特定类型的对象,你需要有一个对应的 `catch` 子句来处理它。 2. 派生类的异常可以被基类的 `catch` 子句捕获,因为派生类是基类的一个实例。但基类的 `catch` 应该放在派生类的 `catch` 之后,否则派生类异常将无法被捕获。 3. 如果 `catch` 参数为基类类型,捕获派生类对象时必须使用引用或指针,以确保多态性。 下面通过几个实例来进一步理解异常处理: **实例1** 展示了如何抛出自定义类型异常。当 `fun` 函数中的条件满足时,会抛出不同类型的异常,包括整型、字符串和自定义类 `Data` 的对象。在 `main` 函数中,我们使用多个 `catch` 子句来分别处理这些不同类型的异常。 **实例2** 利用了C++的标准异常类 `std::exception`。当试图分配大量内存时,由于内存不足,`new` 操作会抛出异常。通过捕获 `exception` 类的引用,我们可以打印出异常信息,提供给用户。 **实例3** 展示了如何创建一个继承自 `std::exception` 的派生类 `FileException`,并在处理文件错误时抛出这种异常。这样,我们可以提供更具体的错误信息,并且仍然可以使用标准的异常处理机制。 异常处理在处理预期之外的错误时非常有用,它允许程序在遇到错误时继续执行,而不是立即崩溃。然而,过度使用异常处理可能导致性能下降,因为异常处理涉及到额外的运行时开销。因此,应谨慎选择何时使用异常,通常只在不可预见的错误或严重异常情况下使用。
- 粉丝: 7
- 资源: 952
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
评论0