C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常

2024-03-28 08:38

本文主要是介绍C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. catch 子句 (catch clause) 中的异常声明(exception declaration)

声明的类型决定了处理代码所能捕获的异常类型。

这个类型必须是完全类型, 它可以是左值引用, 但不能是右值引用

1.1 catch 的参数类型可以是引用类型或非引用类型

如果 catch 的参数是基类类型, 则我们可以使用其派生类类型的异常对象对其进行初始化。 此时, 如果 catch 的参数是非引用类型, 则异常对象将被切掉一部分

异常声明的静态类型将决定 catch 语句所能执行的操作。如果 catch 的参数是基类类型, 则 catch 无法使用派生类特有的任何成员。

1.2 查找匹配的处理代码

在搜寻 catch 语句的过程中, 我们最终找到的 catch 未必是异常的最佳匹配。 相反,挑选出来的应该是第一个与异常匹配的 catch 语句。 因此, 越是专门的 catch 越应该置于整个 catch 列表的前端

绝大多数类型转换都不被允许, 除了一些极细小的差别之外:

  • 允许从非常量向常量的类型转换, 也就是说, 一条非常量对象的 throw 语句可以匹配一个接受常量引用的 catch 语句。
  • 允许从派生类向基类的类型转换。
  • 数组被转换成指向数组( 元素) 类型的指针, 函数被转换成指向该函数类型的指针

1.3 重新抛出

一条 catch 语句通过重新抛出 (rethrowing) 的操作将异常传递给另外一个 catch 语句。 这里的重新抛出
仍然是一条 throw 语句, 只不过不包含任何表达式:
throw;

{// 使用引用类型的异常声明catch (my_error &eObj) {eObj.status = errCodes::severeErr;     //修改异常对象throw;//重新抛出} catch (other_error_eObj) {// 非引用类型eObj.status = errCodes::badErr;//只是修改了对象的局部副本throw;//异常对象的status没有修改}
}

1.4 .捕获所有异常 (catch-all)

使用省略号作为异常声明,如 catch (… )

catch(…);一条语句可以和任意类型的异常对象匹配。

它经常和重新抛出语句一起使用,其中catch执行完当前局部能够完成的工作之后,重新抛出异常。

{void manip () {try {// 这里的操作将引发并抛出一个异常} catch (...) {// 处理异常的某一些操作throw;}}// catch(...)既可以单独出现// 也可以和其他的catch一起出现// 如果和其他的catch一起出现// 则它必须放在最后的位置// 否则放在捕获所有异常的catch语句之后的catch语句永远不会被执行
}

这篇关于C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/855067

相关文章

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Python实战之SEO优化自动化工具开发指南

《Python实战之SEO优化自动化工具开发指南》在数字化营销时代,搜索引擎优化(SEO)已成为网站获取流量的重要手段,本文将带您使用Python开发一套完整的SEO自动化工具,需要的可以了解下... 目录前言项目概述技术栈选择核心模块实现1. 关键词研究模块2. 网站技术seo检测模块3. 内容优化分析模

深入解析C++ 中std::map内存管理

《深入解析C++中std::map内存管理》文章详解C++std::map内存管理,指出clear()仅删除元素可能不释放底层内存,建议用swap()与空map交换以彻底释放,针对指针类型需手动de... 目录1️、基本清空std::map2️、使用 swap 彻底释放内存3️、map 中存储指针类型的对象

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

C++ STL-string类底层实现过程

《C++STL-string类底层实现过程》本文实现了一个简易的string类,涵盖动态数组存储、深拷贝机制、迭代器支持、容量调整、字符串修改、运算符重载等功能,模拟标准string核心特性,重点强... 目录实现框架一、默认成员函数1.默认构造函数2.构造函数3.拷贝构造函数(重点)4.赋值运算符重载函数

C++ vector越界问题的完整解决方案

《C++vector越界问题的完整解决方案》在C++开发中,std::vector作为最常用的动态数组容器,其便捷性与性能优势使其成为处理可变长度数据的首选,然而,数组越界访问始终是威胁程序稳定性的... 目录引言一、vector越界的底层原理与危害1.1 越界访问的本质原因1.2 越界访问的实际危害二、基

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制