c++ primer plus 第15章友,异常和其他,15.3.8exception 类

c++ primer plus 第15章友,异常和其他,15.3.8exception 类

15.3.8exception 类

文章目录

  • c++ primer plus 第15章友,异常和其他,15.3.8exception 类
  • 15.3.8exception 类
    • 1.stdexcept异常类
    • 3.空指针和 new


15.3.8exception 类

C++异常的主要目的是为设计容错程序提供语言级支持,即异常使得在程序设计中包含错误处理功能更容易,以免事后采取一些严格的错误处理方式。异常的灵活性和相对方便性激励着程序员在条件允许的情况下在程序设计中加入错误处理功能。总之,异常是这样一种特性:类似于类,可以改变您的编程方式。
较新的 C++编译器将异常合并到语言中。例如,为支持该语言,exception头文件(以前为exception.h或except.h)定义了 exception 类,C++可以把它用作其他异常类的基类。代码可以引发exception 异常,也可以将 exception 类用作基类。有一个名为 what()的虚拟成员函数,它返回一个字符串,该字符串的特征随实现而异。然而,由于这是一个虚方法,因此可以在从exception派生而来的类中重新定义它:

#include <exception>
class bad_hmean :public std::exception
{
public:const char *what()return "bad arguments to hmean()";
};
class bad_gmean :public std::exception
{
public :
const char*what(){return "bad arguments to gmean()";
};

如果不想以不同的方式处理这些派生而来的异常,可以在同一个基类处理程序中捕获它们:

try
{
...
}
catch(std::exception &e)
{cout <<e.what()<<endl;
}

否则,可以分别捕获它们。
C++库定义了很多基于exception 的异常类型:

1.stdexcept异常类

头文件 stdexcept 定义了其他几个异常类。首先,该文件定义了logic error 和 runtime error 类,它们都是以公有方式从exception 派生而来的:

class logic error:public exception{
public :
explicit logic error(const string& what arg);
...
};
class domain_error :public logic errorpublic :
explicit domain error(const string& what arg);
};

注意,这些类的构造函数接受一个string对象作为参数,该参数提供了方法 what()以 C-风格字符串方式返回的字符数据。
这两个新类被用作两个派生类系列的基类。异常类系列 logic_error 描述了典型的逻辑错误。总体而言,通过合理的编程可以避免这种错误,但实际上这些错误还是可能发生的。每个类的名称指出了它用于报告的错误类型:

  • domain error;
  • invalid arqument;
  • length error;
  • out of bounds.

每个类独有一个类似于 logic error 的构造函数,让您能够提供一个供方法 what()返回的字符串。数学函数有定义域(domain)和值域(range)。定义域由参数的可能取值组成,值域由函数可能的返回值组成。例如,正弦函数的定义域为负无穷大到正无穷大,因为任何实数都有正弦值:但正弦函数的值域为-1到+1,因为它们分别是最大和最小正弦值。另一方面,反正弦函数的定义域为-1到+1,值域为-到+"。如果您编写一个函数,该函数将一个参数传递给函数 std:sin(),则可以让该函数在参数不在定义域
-1到+1之间时引发 domain error 异常。异常 invalid argument指出给函数传递了一个意料外的值。例如,如果函数希望接受一个这样的字符串其中每个字符要么是’0’要么是’1’,则当传递的字符串中包含其他字符时,该函数将引发imnvalid_argument 异常。异常 length_error 用于指出没有足够的空间来执行所需的操作。例如,string类的append()方法在合并得到的字符串长度超过最大允许长度时,将引发1engtherror异常。
异常 out of bounds 通常用于指示索引错误。例如,您可以定义一个类似于数组的类,其 operator()[]在使用的索引无效时引发out of bounds 异常。
接下来,runtime_error 异常系列描述了可能在运行期间发生但难以预计和防范的错误。每个类的名称指出了它用于报告的错误类型:

  • range error;
  • overflow error;
  • underflow error.
    每个类独有一个类似于 runtime_error 的构造函数,让您能够提供一个供方法 what( )返回的字符串。下溢(underfow)错误在浮点数计算中。一般而言,存在浮点类型可以表示的最小非零值,计算结果比这个值还小时将导致下溢错误。整型和浮点型都可能发生上溢错误,当计算结果超过了某种类型能够表示的最大数量级时,将发生上溢错误。计算结果可能不再函数允许的范围之内,但没有发生上溢或下溢错
    误,在这种情况下,可以使用range_error 异常。一般而言,logic_error 系列异常表明存在可以通过编程修复的问题,而runtimeerror 系列异常表明存在无法避免的问题。所有这些错误类有相同的常规特征,它们之间的主要区别在于:不同的类名让您能够分别处理每种异常。另一方面,继承关系让您能够一起处理它们(如果您愿意的话)。例如,下面的代码首先单独捕获 out_ofbounds 异常,然后统一捕获其他logic_error 系列异常,最后统一捕获 exception 异常、runtime error系列异常以及其他从exception派生而来的异常:
try {
...
}
catch(out of bounds &oe)// catch out of bounds error
{...}
catch(logic error &oe)
//catch remaining logic error family
{...}
catch(exception &oe)
//catch runtime error,exception objects
{...}

如果上述库类不能满足您的需求,应该从logic_error或runtime_error 派生一个异常类,以确保您异常类可归入同一个继承层次结构中。
2.bad alloc 异常和 new
对于使用 new 导致的内存分配问题,C++的最新处理方式是让new引发bad_alloc异常。头文件 new包含 bad alloc 类的声明,它是从 exception 类公有派生而来的。但在以前,当无法分配请求的内存量时,new 返回一个空指针。
程序清单 15.13演示了最新的方法。捕获到异常后,程序将显示继承的 what()方法返回的消息(该消息随实现而异),然后终止。
程序清单 15.13newexcp.cpp

// newexcp.cpp -- the bad_alloc exception
#include <iostream>
#include <new>
#include <cstdlib>  // for exit(), EXIT_FAILURE
using namespace std;struct Big
{double stuff[20000];
};int main()
{Big * pb;try {cout << "Trying to get a big block of memory:\n";pb = new Big[10000]; // 1,600,000,000 bytescout << "Got past the new request:\n";}catch (bad_alloc & ba){cout << "Caught the exception!\n";cout << ba.what() << endl;exit(EXIT_FAILURE);}cout << "Memory successfully allocated\n";pb[0].stuff[0] = 4;cout << pb[0].stuff[0] << endl;delete [] pb;// cin.get();return 0; 
}

下面该程序在某个系统中的输出:
Trying to get a big block of memory:Caught the exception!std::bad alloc
在这里,方法what( )返回字符串“std::bad_alloc”
如果程序在您的系统上运行时没有出现内存分配问题,可尝试提高请求分配的内存量。

3.空指针和 new

很多代码都是在 new 在失败时返回空指针时编写的。为处理 new的变化,有些编译器提供了一个标记(开关),让用户选择所需的行为。当前,C++标准提供了一种在失败时返回空指针的new,其用法如下:

int *pi =new(std::nothrow)int;
int *pa = new(std::nowthrow)int[500];

使用这种new,可将程序清单15.13的核心代码改为如下所示:

Big *pb;
pb =new(std::nothrow)Big[10000];//1,600,000,000 bytesif(pb ==0)
cout <<"Could not allocate memory.Bye.n";
exit(EXIT FAILURE);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/44434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA良心给显卡免费升级,只为挨更多的骂

起猛了&#xff0c;还真的以为 NVIDIA 良心发现了。 众所周知&#xff0c;英伟达对于咱们普通游戏玩家向来不屑一顾。只因为游戏业务在 NVIDIA 收入中占比较少。 在最新的 40 系显卡 RTX 4070 Ti Super 显卡中&#xff0c;NVIDIA悄悄给它来了一次核心「升级」&#xff0c;将原…

ARM学习(29)NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择

ARM学习&#xff08;28&#xff09;NXP 双coreMCU IMX1160学习----NorFlash 启动引脚选择 1、多种启动方式介绍 IMX1166 支持多组flexSPI 引脚启动&#xff0c;FlexSPI1以及FlexSPI2&#xff0c;通过boot cfg可以切换FlexSPI得实例。 每个实例又支持多组引脚&#xff0c;总共…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

Subclass-balancing Contrastive Learning for Long-tailed Recognition 核心公式解析温度参数 τ \tau τ的作用公式5解析 核心公式解析 L S B C L − ∑ i 1 N ( 1 ∣ M ~ i ∣ ∑ z p ∈ M ~ i log ⁡ exp ⁡ ( z i ⋅ z p ⊤ / τ 1 ) ∑ z a ∈ V ~ i exp ⁡ ( z i ⋅ z…

LiteOS增加执行自定义源码

开发过程注意事项&#xff1a; 源码工程路径不能太长 源码工程路径不能有中文 一定要关闭360等杀毒软件&#xff0c;否则编译的打包阶段会出错 增加自定义源码的步骤: 1.创建源码目录 2. 创建源文件 新建myhello目录后&#xff0c;再此目录下再新建源文件myhello_demo.c 3. 编…

程序员学长 | PyCaret,一个超强的 python 库

本文来源公众号“程序员学长”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;PyCaret&#xff0c;一个超强的 python 库 今天给大家分享一个超强的 python 库&#xff0c;PyCaret。 https://github.com/pycaret/pycaret 简介 …

[论文笔记]RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL

引言 今天带来又一篇RAG论文笔记&#xff1a;RAPTOR: RECURSIVE ABSTRACTIVE PROCESSING FOR TREE-ORGANIZED RETRIEVAL。 检索增强语言模型能够更好地适应世界状态的变化并融入长尾知识。然而&#xff0c;大多数现有方法只能从检索语料库中检索到短的连续文本片段&#xff0…

random.choices 的参数及其应用

random.choices 是 Python 的 random 模块中的一个函数&#xff0c;用于从给定的序列中随机选择元素&#xff0c;可以设置权重。这个函数在需要根据特定概率分布进行随机选择的场景中非常有用。下面是 random.choices 的参数及其详细介绍&#xff1a; 文章目录 参数应用示例基本…

释放序列和同步

#include <iostream> #include<thread> #include<atomic> #include<vector> std::atomic<int>count(0); std::vector<int>queue_data; //如果存储操作被标记为memory_order_release、memory_order_acq_rel或memory_order_seq_cst&#xff…

FP5207+音频功率放大器的组合解决方案-适用于便携式音频播放器、无线耳机、智能音箱和车载音响系统等高质量音频输出需求的产品,以提高电池供电的效率和输出功率

随着消费者对智能家居的需求增长&#xff0c;智能音响市场成为重要增长点。同时&#xff0c;音响技术也在不断发展&#xff0c;音响及扬声器的功能和性能不断提升。 蓝牙音箱&#xff0c;这类音箱供电是以锂电池为主&#xff0c;一般选用内置升压的音频功放芯片&#xff0c;音响…

iOS input 标签 focus 失效

解决方案 <inputv-if"show"ref"inputRef" />watch(inputRef, (ref) > {ref?.focus(); });

vivado DQS_BIAS

DQS_偏差 DQS_BIAS是驱动差分输入缓冲器的顶级端口的属性&#xff0c;或者 双向缓冲基元&#xff08;IBUFDS、IOBUFDS&#xff09;。 DQS_BIAS属性在某些的输入端提供可选的DC偏置 伪差分I/O标准&#xff08;DIFF_SSTL&#xff09;和真差分I/O规范&#xff08;LVDS&#xff09;…

windows 构建nginx本地服务随系统自启

1.先去官网下载一个nginxzip 2.将zip解压&#xff0c;将nginx-server.exe文件放入文件夹 3.创建nginx-server.xml&#xff0c;将以下内容放进文件内 <service> <id>nginx</id> <name>Nginx Service</name> <description>High Per…

强化学习中的蒙特卡洛算法和时序差分算法

在强化学习&#xff08;Reinforcement Learning, RL&#xff09;中&#xff0c;价值函数的估计是核心任务之一。蒙特卡洛&#xff08;Monte Carlo, MC&#xff09;方法和时序差分&#xff08;Temporal Difference, TD&#xff09;方法是两种常用的策略&#xff0c;用于估计状态…

软件架构之架构风格

软件架构之架构风格 9.3 软件架构风格9.3.1 软件架构风格分类9.3.2 数据流风格9.3.3 调用/返回风格9.3.4 独立构件风格9.3.5 虚拟机风格9.3.6 仓库风格 9.4 层次系统架构风格9.4.1 二层及三层 C/S 架构风格9.4.2 B/S 架构风格9.4.3 MVC 架构风格9.4.4 MVP 架构风格 9.5 面向服务…

机器学习筑基篇,​Ubuntu 24.04 编译安装 Python 及多版本切换

[ 知识是人生的灯塔&#xff0c;只有不断学习&#xff0c;才能照亮前行的道路 ] Ubuntu 24.04 编译安装最新Python及多版本切换 描述&#xff1a;说到机器学习&#xff0c;人工智能&#xff0c;深度学习不免会提到Python这一门编程语言&#xff08;人生苦短&#xff0c;及时Pyt…

windows防火墙端口设置

PS&#xff1a;本文实例为Windows Server 2019&#xff0c;其他Windows版本大同小异。 1、首先打开windows防火墙&#xff0c;点击“高级设置” 2、 高级设置界面 3、假设需要开放一个端口为3306应该怎么做 光标对准“入站规则”右键新建规则&#xff0c;选择“端口” 协议这…

C++类和对象(一)

目录 面向过程和面向对象 面向过程编程&#xff08;Procedural Programming&#xff09; 面向对象编程&#xff08;Object-Oriented Programming&#xff09; 一、类的定义 类定义格式 类域 二、类的访问限定符及封装 访问限定符 封装 三、实例化 实例化概念 对象大小…

软件运行次数

题目&#xff1a; 实现一个验证程序运行次数的小程序&#xff0c;要求如下&#xff1a; 当程序运行超过3次时给出提示&#xff1a;本软件只能免费使用3次&#xff0c;欢迎您注册会员后继续使用&#xff5e;程序运行演示如下&#xff1a; 第一次运行控制台输出&#xff1a;欢迎…

常见WAF拦截页面总结

(1) D盾 (2) 云锁 (3) UPUPW安全防护 (4) 宝塔网站防火墙 (5) 网防G01 (6) 护卫神 (7) 网站安全狗 (8) 智创防火墙 (9) 360主机卫士或360webscan (10) 西数WTS-WAF (11) Naxsi WAF (12) 腾讯云 (13) 腾讯宙斯盾 (14) 百度云 图片 (15) 华为云 (16) 网宿云 (17) 创宇盾 图片 (…

ROS服务通信自定义srv

服务通信自定义srv 流程:创建ROS功能包按照固定格式创建srv文件编译配置文件编译生成中间文件 流程: srv 文件内的可用数据类型与 msg 文件一致&#xff0c;且定义 srv 实现流程与自定义 msg 实现流程类似&#xff0c;需查阅msg文件的可以浏览ROS话题通信流程自定义数据msg格式…