为什么最好在c++中使用异常

【C++】C++异常语法、使用、规范、异常安全及异常的优缺点 实际中我们可以可以去继承exception类实现自己的异常类。但是实际中很多公司像上面一样自己定义一套异常继承体系。因为C++标准库设计的不够好用。如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catch 关键字。try 块中放置可能抛出异常的代码,try 块中的代码被称为保护代码。C++ 提供了一系列标准的异常,定义在 中,我们可以在程序中使用这些标准的异常。异常是一种处理错误的方式, 阅读详情

转自:http://blog.youkuaiyun.com/zhangsw_00/archive/2007/07/19/1698743.aspx

 

常用的错误处理方式

 

  返回值:我们常用函数的返回值来标志成功或者失败,甚至是失败的原因。但是这种做法最大的问题是如果调用者不主动检查返回值也是可以被编译器接受的,你也奈何不了他:) 这在C++中还导致另外一个问题,就是重载函数不能只有不同的返回值,而有相同的参数表,因为如果调用者不检查返回值,则编译器会不知道应该调用哪个重载函数。当然这个问题与本文无关,我们暂且放下。只要谨记返回值可能被忽略的情况即可。

  全局状态标志。例如系统调用使用的errno。返回值不同的是,全局状态标志可以让函数的接口(返回值、参数表)被充分利用。函数在退出前应该设置这个全局变量的值为成功或者失败(包括原因),而与返回值一样,它隐含的要求调用者要在调用后检查这个标志,这种约束实在是同样软弱。全局变量还导致了另外一个问题,就是多线程不安全:如果多个线程同时为一个全局变量赋值,则调用者在检查这个标志的时候一定会非常迷惑。如果希望线程安全,可以参照errno的解决办法,它是线程安全的。

 

      异常:现在我们再来看看异常能解决什么问题。对于返回值和errno遇到的尴尬,对异常来说基本上不存在,如果你不捕获(catch)程序中抛出的异常,默认行为是导致abort()被调用,程序被终止(core dump)。因此你的函数如果抛出了异常,这个函数的调用者或者调用者的调用者,也就是在当前的call stack上,一定要有一个地方捕获这个异常。而对于setjmp()/longjmp()带来的栈上对象不被析构的问题对异常来说也是不存在的。那么它是否破坏了结构化(对于OO paradigms,也许应该说是破坏了流程?)呢?显然不是,有了异常之后你可以放心的只书写正确的逻辑,而将所有的错误处理归结到一个地方,这不是更好么? 

     

    异常的优势:

       1。能够用较小的投入写出高质量的代码,省去了很多测试的时间。

        通常可以用try/catch/throw返回一个状态(有时也称为错误代码),调用者被假定为通过判定返回值确定函数是否执行成功。

        尽管返回技术有时候似乎是最适当的错误处理技术,但是他也会增加一些令人厌恶的负面影响,例如:

 

       a.降低性能

        正如大家所知道的,相对其他判断而言,条件判断几乎10倍错误概率,因此,其他的事情相当于,如果你能把条件判定相关的代码移出你的工程,你很有可能会有一个相对健壮很多的代码。

 

        b.会延缓开发周期,提高成本

        会增加很多白鹤测试的测试用例,不必要的条件判定会增加很多的测试人力方面的开销;如果你没有测试过每一个代码分支,可能会有一些遗留bug,如果遗留给用户,将是非常严重的事情。

 

        c.增加开发成本

        发现bug,修改bug,测试bug将会增加很多不必要的流程控制复杂度。

        因此与用if判定错误代码相比,try/catch/throw会有少量的bug,相对便宜的开发成本,较短的开发周期,当然,如果你的团队没有使用exception相关的经验,你可以在一些预言性的项目上练习一下,以确保你知道怎么用它。

 

       2.构造函数调用失败后的处理

        构造函数没有返回值,因此不能返回错误代码,因此,用信号通知调用者调用失败的方法是抛出异常。

 

       3.析构函数调用失败后的处理

       写错误日至或者调用其他相关接口都可以,但是不要抛出异常 ,否则,如果该类中其他对象抛出了异常,在析构函数中再抛出异常,程序将terminate.

Matlab实战:从零搭建弹道导弹六自由度仿真模型(附完整代码) 本文详细介绍了如何使用Matlab从零搭建弹道导弹六自由度仿真模型,涵盖仿真环境配置、核心运动方程实现、气动力建模及仿真结果分析。通过完整代码示例,帮助读者掌握弹道导弹六自由度仿真的关键技术,适用于航空航天工程和复杂系统建模领域。 阅读详情

相关推荐

Unity游戏开发客户端Lua基础

Unity游戏开发客户端面经之 lua 篇

Sea3752的博客 1万+

C/C++相对论——C++中为什么要使用异常?

C++中为什么要使用异常? 很多人也许知道C++中的异常机制,很多人也许不知道。很多人知道C中常用的assert,也知道在编译时候指定NODEBUG来忽略它。 对于C语言,使用正常的if-else即是很好的选择,而在C++中,如果使用了面向对象的编程,最好还是使用Exception机制。这主要设计对象能否正确的析构的问题。 C中的出错跳转setjmp和longjmp C语言中常用的用于处理...

weixin_34345753的博客 238

跟着团子学SAP CO:熟练使用结果分析码实现各个场景下收入成本的匹配(一) KKA2/CJ88

PS模块中对财务顾问最难的点在于项目结算,特别是销售型的项目结算。针对客户型项目结算我列举了以下常见的收入成本匹配的一些场景: (1)在项目执行过程中会多次开票,但由于各期成本浮动很大(如前期可能只涉及一些人工、中期全是比较金额较大的材料费),所以希望开票的时候能通过合理的一些指标进行主营业务成本与主营业务收入的匹配。 (2)项目过程中会多次开票,开票确认主营业务收入时,直接将累计发生的实际成本结转为主营业务成本。 (3)项目过程中虽多次开票,但不确认收入,所有发生的实际成本月末计算为在制品,最后项目一次性

Lucas1211的博客 9536

C++里为什么要用异常处理try和catch

本文介绍初学者对异处理的误解,C++异常语句的用法,以及编程中为什么要用异常处理语句。一、初学者对异常处理的误解       网络上的很多文章对异常处理的开篇解释大概是这样的:人们设计出来的程序,做不到天衣无缝,在运行时总会出现各种意想不到的异常。因此,希望程序不仅能在正确的情况下正常运行,而且在程序有错误的情况下也能作出相应的处理,而不致使程序莫名其妙的终止崩溃,甚至出现死机的现象。比如做除法时...

Dengdew的博客 4774

Dify与钉钉轻量级集成:打造企业内部AI助手

企业级聊天机器人开发已成为提升内部协同效率的关键技术。其核心原理在于通过API集成,将AI模型能力与即时通讯平台无缝连接,实现智能问答与自动化流程。从技术价值看,这种集成方案能够显著降低AI应用落地门槛,将前沿的AI能力快速转化为实际生产力。在应用场景上,它尤其适用于HR答疑、IT技术支持、产品知识库等高频内部服务场景。本文聚焦于Dify与钉钉的轻量级集成方案,通过Stream模式实现高效消息处理,并利用AI卡片支持流式输出,为企业构建体验自然的智能机器人提供了完整实践路径。该方案特别强调配置简化与部署便捷

weixin_27155667的博客 698

专访高性能计算专家赵开勇:无人机/机器人开发实战,如何优化深度学习?

从能够自主飞行的无人机,到能和小朋友玩物体识别等游戏的机器人,极客们对智能设备追求没有止境。除了轻巧的体积、超长的续航,更重要的是要有一个智能的“大脑”,来实现人类能够想得到的人机交互,或者智能化的自主决策和行为动作,毫无疑问强大的深度学习能力不可或缺。那么,拒绝束缚人类想象力的嵌入式智能设备,其开发工作需要什么样的环境和工具?开发者进行相关开发的可行思路是什么?近日,优快云记者就此专访了智能设...

happytofly的博客 3510

C++应该使用异常吗

其实关于这点,很多人没有一个统一,google c++ code style 不推荐使用,连go语言里异常也不推荐使用。 根据我项目经验,使用异常会使代码整洁、不需要每个层都检查那么多的返回错误。 该项目是一个用c++实现的thrift server,被web前端的java调用。该thrift server分三层,最外是facade层,thrift接口数据和业务数据的转换,中间是业务数据,下面

lotusdeng2010的专栏 2494

嵌入式NuttX RTOS面试题及参考答案

NuttX 的板级支持包(BSP)是一组软件组件,用于将 NuttX 操作系统适配到特定的硬件平台上。BSP 提供了硬件抽象层,使得 NuttX 能够与硬件进行交互,包括初始化硬件设备、提供设备驱动程序等。BSP 的主要作用是隐藏硬件细节,为上层应用程序和操作系统内核提供统一的接口,从而提高软件的可移植性和可维护性。开发 NuttX 的 BSP 通常需要以下步骤:硬件分析:首先需要对目标硬件平台进行详细的分析,了解硬件的架构、处理器类型、外设接口等信息。

大模型大数据攻城狮的专栏 1306

c++异常

c++ 异常 C++是一种非常灵活的语言,但并不是非常安全。编译器允许编写改变随机内存地址或者除以0的代码(计算机无法处理无穷大)。异常就是试图增加一点安全性的语言特性。异常是一种无法预料的情形。例如,如果编写一个获取Web页面的函数,就有几件事情可能出错。包含页面的Internet主机可能被关闭,页面可能是空白的,或者连接可能会丢失。处理这种情况的一种方法是,从函数返回特定的值,如nullpt...

wrdasj的博客 236

生物量预测:基于Swin-Unet模型的生物量模型预测

本文提出了一种基于Swin-Unet架构的多源遥感地上生物量(AGB)预测方法。该方法整合了光学影像、SAR雷达影像、气候环境参数以及地形数据(坡度和坡向)等多源信息,通过24个输入通道(13+2+7+1+1)构建预测模型。研究采用Min-Max归一化预处理数据,并使用80%训练集、16%验证集和20%测试集的划分策略。模型基于Swin-Unet 2D架构,设置64个初始滤波器、4层深度、4×4堆叠数和2×2补丁大小。该方法通过整合多源遥感数据和先进深度学习架构,为AGB反演提供了新的解决方案。

此星光明博客 64

【文献阅读】使用深度语音后验改进独立于说话者的构音障碍可懂度分类

原文名称:本文探讨了利用DeepSpeech后验概率改进说话人无关的构音障碍可理解性分类方法。作者提出了一个基于DeepSpeech(一种端到端的语音转文本引擎)输出的新特征集,用于评估构音障碍患者的语音可理解性。这些新特征在说话人无关的情况下表现良好,能够更好地处理不同说话人的变异性。背景介绍:数据集:特征提取:实验设置:结果:本文提出的新特征集在说话人无关的构音障碍可理解性分类任务中表现出色,特别是在低可理解性和高可理解性类别上。未来的工作将集中在减少低可理解性和中可理解性类别之间的混淆,以进一步提高系

帅小柏的博客 452

C++11异常安全

异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的 直接或间接的调用者处理这个错误。

guaiguaiyalj的博客 320

Aip1640、TM1640驱动程序

本文介绍了AIP1640/TM1640驱动芯片的编程实现,主要包括硬件接口定义和通信协议函数。通过宏定义配置时钟(CLK)和数据线(DIO)的GPIO控制,实现了I2C协议的启动、停止、字节发送等基本操作。核心函数AIP1640_Disp_Drive()完成显示驱动流程:先发送0x40命令设置地址自增模式,再发送0xC0起始地址和16字节显示数据,最后设置亮度参数。文中还包含5微秒延时函数、显示数据缓冲区定义,以及LED和数码管(SMG)的位映射注释说明。该代码适用于控制LED数码管显示,支持亮度调节功能。

zqx的博客 1404

构造函数= default;_默认构造函数最好简单而且不会抛出异常

C.44: Prefer default constructors to be simple and non-throwingC.44:默认构造函数最好简单而且不会抛出异常Reason(原因)Being able to set a value to "the default" without operations that might fail simplifies error handling ...

weixin_39942488的博客 243

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

[cpp进阶]C++异常

在实际使用中,我们会自定义异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者没有办法识别异常是从哪一个业务层抛出的,所以实际中都会定义一套继承的规范体系。

weixin_53027918的博客 2967

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

[cpp] 异常

[cpp] 异常 详解

BinaryWiker的博客 1576

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【C++】C++中异常及异常的使用

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了public:, _id(id){}protected:int _id;

zxctsclrjjjcph的博客 1386

【C++入门到精通】异常 | 异常的使用 | 自定义异常体系 [ C++入门 ]

异常是一种在程序运行过程中出现错误或异常情况时的处理机制。它能够提高程序的健壮性,提高代码的可读性和可维护性,允许异常在不同的层次上被捕获和处理,提高程序的灵活性和扩展性。然而,异常也可能会带来性能、可移植性和安全性等方面的问题,因此在使用时需要权衡利弊,选择合适的处理方式,以保证程序的健壮性和安全性。

Yawesh的博客 2196

【C++】异常机制

讲解C++中的异常机制!

YoungMLet的博客 2669

[PHP-CPP]使用C++来扩展PHP的能力

一个使用C++来开发PHP扩展的开源项目 什么是PHP-CPP? 它是一个C++库,用来开发PHP的扩展.它提供了一个文档丰富且易于使用的类库,可以使用这些类库开发PHP的扩展.也就是说我们可以用C++来开发PHP的扩展了. 为什么要使用PHP-CPP? 使用这个C++库,可以非常享受的开发出一个PHP的扩展,使用它编写的代码简单易懂,并且能为你的软件带来很大的提升. 使用PHP-CPP的特性和原因 1.性能更快 使用C++编写的代码相比PHP的代码来说,非常非常快,在官网给出的一个冒

PHP武器库 1506

C++之异常

C++异常部分介绍

2302_81120572的博客 1474

C++异常

文章目录:生产与消费者模型  C++异常    异常概念       C语言传统的错误处理方式       C++异常    异常的使用与安全       异常使用       异常规范与开发常用异常体系       异常安全    C++标准库的异常体系    异常的优缺点       异常优点       异常缺点  异常是一种处理错误的方式,当一个函数发现自己无法处理的错误时就可以抛出异常,让函数的直接或间接的调用者处理这个错误。  如果有一个块抛出一个异常,捕获异常的方法会使用 try 和 catc

欢迎来到阿熊的blog~~ 1186

PHP-CPP异常处理机制:从C++到PHP的错误传递终极指南

PHP-CPP是一个强大的C++库,它允许开发者创建高效的PHP扩展,将C++的性能优势与PHP的灵活性完美结合。在开发PHP扩展时,异常处理是确保代码健壮性和可靠性的关键环节。本文将深入探讨PHP-CPP的异常处理机制,从C++异常的抛出到PHP错误的传递,为你提供一套完整的错误处理解决方案。 ## 🧩 PHP-CPP异常体系核心组件 PHP-CPP提供了一套完善的异常处理体系,主要包含以

gitblog_00507的博客 539

【C++11】异常机制

异常是一种处理错误的方式:当一个函数发现自己无法处理的错误时就可以抛出异常,让这个函数的直接或间接调用者去处理这个错误。throw:当问题出现时,程序会抛出一个异常(可以是任意类型的对象)。这是通过使用 throw 关键字来完成的。try:try 块中的代码标识“将被激活的特定异常”,它后面通常跟着一个或多个 catch 块。catch:在您想要处理问题的地方,通过异常处理程序捕获异常,catch 关键字用于捕获异常,可以有多个 catch 进行捕获。

m0_51064412的博客 1022

C++异常详解

C语言中处理错误的方式与缺陷、C++异常的介绍、C++异常关键字、异常的使用、异常的抛出和匹配原则、异常的重新抛出、自定义异常体系、异常安全、异常规范、C++标准库的异常体系、异常的优缺点

wuqiongjin的博客 2511
上一篇: C++异常处理须知
下一篇: 错误处理和异常处理,你用哪一个
UU_Yang
博客等级 码龄23年 926粉丝 213原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值