STL-----错误(error)处理和异常(exception)处理

C++异常处理全解析:从标准异常到自定义体系与工程实践 异常处理是现代编程语言中用于管理运行时错误的核心机制,其原理是通过分离正常代码与错误处理逻辑来提升程序的健壮性与可维护性。在C++中,标准库提供了以std::exception为基类的完整异常体系,包括std::logic_error(如invalid_argument、out_of_range)用于处理逻辑错误,以及std::runtime_error用于应对运行时环境问题。掌握异常处理的技术价值在于构建能够优雅应对意外情况、保障资源安全释放的可靠软件。在服务器后端、嵌入式系统等应用场景中,合理的异常设计 阅读详情

C++标准程序库由不同的成分构成。来源不同,设计与实现风格迥异。而错误处理和异常处理正是这种差异的一个典型体现。

1.1 标准异常类别

 

  语言本身或者标准库所抛出的所有异常,都派生自积累exception.这是其它数个标准异常类别的基类,它们共同构成一个类体系具体如下:

这些标准异常可分为三组:{1.语言本身支持的异常;2.C++标准程序库发出的异常;3.程序作用域(scope of a program)之外发出的异常}

exception:

 1)bad_alloc

 2)bad_cast

 3)bad_typied

 4)logic_error {domain_error、invalid_argument、length_error、out_of_range}

 5)ios_base::failure

 6)runtime_error {range_error、overflow_error、underflow_error}

 7)bad_exception

1.1.1 语言本身支持的异常

   此类异常用以支撑某些语言特性,所以从某种角度来说它们不是标准程序库的一部分,而是核心语言的一部分。如果以下操作失败,就会抛出这类异常。

  ----全局操作符new操作失败,就会抛出bad_alloc异常(若采用new的nothrow版本,就另当别论)。由于这个异常可能于任何时间在任何复杂的程序中发生,所以可说是最重要的一个异常。

  ----执行期间,当一个加诸于reference身上的"动态性别转换操作"失败时,danamac_cast会抛出bad_cast异常。

  ----执行期型别辨识(RTTI)过程中,如果交给typeid的参数为零或空指针,typeid操作符会抛出bad_typeid异常。

  ----如果发生非预期的异常,bad_exception异常会接手处理,方式如下:当函数抛出异常规格(excepiton specification)以外的异常,bad_excepiton就会调用unexcepted()。例如:

 class E1;
 class E2;//not derived from E1
 void f() throw(E1)//throws only excepiton of type E1
 {
    ...
    throw E1();//throws eception of type E1
    ...
    throw E2();//calls unexcepted(),which calls
    terminate()
 }

f()之中抛出“型别为E2”的异常,这种动作违反了异常规则(exception specification)的设定,于是唤起了unexcepted(),后者通常唤起了terminate()终止程序。

  然而如果在你的异常规则中列出bad_exception,那么unexcepted()纵使会重新抛出(rethrow)bad_exception异常。

  class E1;

  class E2;//not derived from E1

   void f() throw(E1,std::bad_exception)//throws only excepiton of type E1 or

                            //bad_exception for any other exception type
 {
    ...
    throw E1();//throws eception of type E1
    ...
    throw E2();//calls unexcepted(),which calls
    bad_exception
 }

 

 

1.1.2 C++标准程序库所发生的异常

  C++标准程序库异常纵使派生自logic_error。从理论上讲,我们能够通过一些手段,从程序中避免逻辑错误。所谓逻辑错误包括违背逻辑前提或者违反class的不变性。C++ STL提供以下逻辑错误类别:

1)invalid_argument表示无效参数,例如讲bitset(array of bits)以char而非'0'或'1'进行初始化。

2)length_error指出某个行为"可能超越了最大极限",例如对着某个字符串附加太多字符。

3)out_range 指出参数值“不在预期范围之内”,例如在诸如array的容器或字符串(string)中采用一个错误索引。

4)domain_error指出专业领域范畴内的错误。

 

  此外,标准程序库的I/O部分提供了一个ios_base::failure的特殊异常。当数据流(data stream)由错误或由到达文件尾端而发生状态改变时,就可能跑出这个异常。

1.1.3 程序作用域(scope of a program)之外发生的异常

派生自runtime_error的异常,用来指出“不在程序范围内,且不容易回避“的事件。C++标准程序库对执行期错误提供了一下三个classes:

1)range_error指出内部算术运算发生区间错误(range error)

2)overflow_error指出算术运算发生上溢位(overflow)

3)underflow_error指出算术运算发生下溢位(underflow)

【注】基础类别exception 和bad_exception定义于<exception>。bad_alloc定义于<new>

 bad_cast 和bad_typeid定义于 <typeinfo>,ios_base::failure定义于 <ios>,其它异常类别定义于<stdexcept>。

 

1.2异常类别(exception class)的成员

  为了catch字句中处理异常,必须采用异常所提供的借口。所有标准异常的接口只含一个成员函数:what(),用以获取"型别本身以外的附件信息"。它返回一个以null结束的字符串:

namespace std{

  class exception{

    public:

    virtual const char  *what() const throw();

    ...

  };

}

 

what()返回的c-string在其所属的异常对象被摧毁后,就不再有效了。

标准异常的其它成员,用来处理生成、复制、销毁等动作。要注意的是,除了what()外,再没有任何异常提供任何其它成员函数,能够描述异常的种类。例如:没有可找出异常上下文(context)的一致性方法,或找出区间错误(range error)发生时的错误索引值。因此,唯一通过用的异常评估手段,大概只有打印一途了:

try{

  ...

}

catch(const std::exception& error){

  //print implementation-defined error message

  std::cerr<<error.what()<<std::endl;

  ...

}

 

 

1.3抛出标准异常

  你可以在自己的程序库或程序内部抛出某些标准异常。允许你这般运用的各个标准异常,生成时都只需要一个string参数,它将被waht()返回的描述字符串。例如logic_error定义如下:

namespace std{

  class logic_error :public exception{

    public:

    explicit logic_error(const string& whatString);

  };

}

提供这种功能的标准异常有:logic_error及其派生类别、runtime_error及其派生类别、ios_base::failure.你不能抛出exception,也不能抛出任何用以支持语言核心性质的异常。

  想要抛出一个标准异常,只需生成一个描述符异常的字符串,并将它初始化,交给异常对象;

std::string s;

...

throw std::out_of_range(s);

 

由char*可被隐式转换为string,所以你可以直接使用字符串字面量;

throw std::out_of_range("out_of_range(somewhere,somehow)");

 

1.4从标准异常类别(exception class)中派生新类别

  另一个在程序中采用标准异常类别的可能情况是,定义一个直接或间接派生自exception的特定异常类别。要这么做,首先必须确保what()机制正常运作,what()是个虚拟函数,所以提供what()方法之一就是自己实现what();

namespace std MyLib{
  /*user-defined exception class,

  *derived from a standard class for exceptions

  */

  class MyProblem : public std::exception{

    public:

    ...

    MyProblem(...);{//special constructor

    }

    virtual const char * what() const  throw(){//what() function

    ...

    }

  };

  ...

   void f(){

    ...

    //create an exception object and throw it

   throw MyProblem(...);

   }

}

 

 

 

 

 

 

 

 

参考:The C++ Standard Library 侯捷 孟岩  译

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C++异常处理规范:从RAII到noexcept的工程实践指南 异常处理是现代编程语言中用于分离错误处理与业务逻辑的核心机制,其原理基于栈展开和对象生命周期管理。在C++中,异常机制与资源获取即初始化(RAII)范式深度集成,通过自动调用析构函数确保资源安全释放,这构成了异常安全性的技术基础。从工程价值看,合理的异常规范能显著提升代码的可维护性和健壮性,尤其在大型项目或对稳定性要求高的系统中。应用场景涵盖构造函数失败报告、跨多层调用栈的错误传播,以及需要强异常保证的关键操作。本文聚焦C++异常处理规范,深入探讨RAII资源管理、noexcept优化以及异常安全等级等实践 阅读详情

相关推荐

C++异常处理全解析:从标准库异常到内存管理避坑指南

异常处理是编程中处理错误的核心机制,它允许程序在遇到无法本地处理的错误时,通过抛出异常对象来中断正常执行流,并由调用栈上层的捕获代码进行统一处理。其技术价值在于将错误处理逻辑与业务逻辑分离,提高代码的可读性和可维护性。在C++中,异常安全尤为重要,它确保程序在异常发生时不会出现资源泄漏或数据不一致。应用场景广泛,从简单的参数验证到复杂的系统调用错误处理都需要异常机制。本文将深入探讨C++标准库异常家族,特别是std::logic_error和std::runtime_error等常见类型,并重点解析内存相关

weixin_33743703的博客 363

c++ - 第20节 - 异常

没有匹配的catch则退出当前函数栈,继续在调用函数的栈中进行查找匹配的catch。3. 抛出异常对象后,会生成一个异常对象的拷贝,因为抛出的异常对象可能是一个临时对象,所以会生成一个拷贝对象,这个拷贝的临时对象会在被catch以后销毁。5. 实际中抛出和捕获的匹配原则有个例外,并不都是类型完全匹配,可以抛出的派生类对象,使用基类捕获,这个在实际中非常实用,我们后面会详细讲解这个。,缺陷:需要程序员自己去查找对应的错误。1. 异常是通过抛出对象而引发的,该对象的类型决定了应该激活哪个catch的处理代码。

qq_45113223的博客 833

C++异常处理:从基础语法到RAII、noexcept与实战模式

在C++编程中,错误处理是构建健壮软件的核心环节。传统上,开发者依赖返回值或全局错误码,但这常导致代码逻辑分散且错误信息易丢失。C++异常机制通过try、throw、catch关键字,实现了控制流的非本地跳转,将错误处理逻辑与业务逻辑分离,提升了代码的可维护性。其技术价值在于支持优雅降级与资源安全释放,结合RAII(Resource Acquisition Is Initialization)原则,可确保栈展开时自动清理资源,避免泄漏。应用场景广泛,从文件操作、网络请求到容器算法,都需要异常来应对外部环境的

weixin_34099526的博客 576

STL教程3-异常机制

可以跳过直接看总结 目录1、基本异常语法2、异常向上抛,一直到顶层3、栈解旋4、异常接口声明5、抛出异常对象5、异常类型和异常变量的声明周期6、异常标准类 7、继承在异常中的应用 8、总结throw ,然后对应的try.....catch ...异常会一层一层的向上抛,如果异常抛到顶层还没有被处理,那么此时程序会使用terminate()去终止程序,c++的异常处理机制是跨函数的。所以throw很类似return,其实就是局部变量离开它的工作空间,会自动的调用析构函数在函数上声明throw只会抛出指定的数

baidu_41553551的博客 539

快手did did_gt edid的注册过程

接口 https://gdfp.ksapisrv.com/rest/infra/gdfp/report/kuaishou/android did 是本地生成的16进制 或者 获取的 android_id did_gt 是did生成时间戳 1595073601970 public static final Random f16237a = new Random(System.currentTimeMillis()); public static long m19668a() {  &n

HURUWO的技术博客 1万+

移远EC800M CAT1模块HTTP POST实战:从AT指令到OneNet平台数据上报(附STM32代码)

本文详细介绍了移远EC800M CAT1模块通过AT指令实现HTTP POST数据上报到OneNet平台的完整流程,包含STM32实战代码。内容涵盖PDP上下文激活、HTTP服务配置、JSON数据包构建等关键技术要点,并提供硬件连接、状态机设计和错误处理等实用方案,助力开发者快速实现物联网设备稳定数据传输。

weixin_42565652的博客 507

STL:异常理论概念

一.基本语法 案例:除数为0. //异常基本语法 int divide(int x, int y) {//除法,分母不能为0 if (y == 0) { throw y;//抛出异常 } return x / y; } void test01() { //试着捕获异常 try { divide(10, 0);//分母为0 } //异常根据类型进行匹配,y是int型,所以这里是int型,用exception接收y catch (int exception) { cout <

weixin_44190648的博客 867

GN算法边介数计算优化指南:如何提升大规模社交网络分析效率

本文深入探讨了GN算法在大规模社交网络分析中的核心瓶颈——边介数计算,并提供了从算法优化到工程部署的完整性能提升方案。通过引入Brandes算法、并行计算、增量更新及分布式处理等策略,有效解决了传统GN算法在处理百万级网络时效率低下的问题,为社交网络社区划分等实际应用提供了高效解决方案。

weixin_29196613的博客 486

C/C++编程:错误(error)处理和异常(exception)处理

C++标准程序库由不同的成分构成。来源不同,设计与实现风格迥异。而错误处理和异常处理正是这种差异的一个典型实现。 标准程序库中有一部分,例如std classes,支持具体的错误处理,他们检测所有可能发生的错误,并于错误发生时抛出异常 像STL,valarrays等,效率重于安全,因此几乎不检验逻辑错误,并且只在执行期(runtime)发生错误才抛出异常 标准异常类别(standard exception classes) 语言本身或者标准程序库所抛出的所有异常,都派生自基类exception。这些.

OceanStar的博客 1万+

基于OpenCV的围棋终局识别与胜负判定系统实现

计算机视觉是人工智能领域的关键技术,它使计算机能够从数字图像或视频中获取、处理和分析信息。其核心原理在于通过图像处理算法提取特征,并基于这些特征进行识别、分类和测量。在工程实践中,计算机视觉技术为自动化、智能化应用提供了强大支持,广泛应用于工业检测、自动驾驶、医疗影像分析等领域。本文聚焦于一个具体的应用场景:利用OpenCV库实现围棋终局识别。通过图像预处理、棋盘检测与透视校正、交叉点定位等步骤,结合围棋规则逻辑,构建了一套从棋盘图像自动判定胜负的解决方案。该方案涉及自适应二值化、霍夫变换、连通域分析等关键

weixin_29100927的博客 279

Tessent Atpg系列 第七章 Running ATPG Patterns -- 如何书写proc文件

本篇文章是记录Tessent scan ATPG系列 本文并非是对userguide的完全翻译,而是自己对userguide的理解,此外,有部分比较深入的内容可能需要后续实验验证。本系列并不对tessent scan做过多描述。 请勿随意转载: 优快云 博主: ciscomonkey一种是在使用tessent scan之后使用ATPG 另一种是使用第三方工具,如snps的DFTC之后使用tessent的ATPG。 这里我们仅仅介绍without tessent scan之后tessent ATPG:对于t

ciscomonkey的博客 7694

C++异常处理机制

缺陷:(1).错误码不好设置,比如:除0操作,就不好返回错误码。如果返回一个数字,可能会有两层含义,错误码或者处理结果。一般我们会定义函数返回值的类型,在规定成功和失败等不同情况返回的数字。(2).需要程序员去查找错误码对应的含义。比如:很多系统接口函数都是把错误码放到全局变量errno中。缺陷:(1).并不能明确知道是什么类型的错误,用户难以接收。C++针对上面的不足,引入了异常的概念,不会终止程序,并且会将错误信息详细介绍。示例程序: 执行结果如下: 异常是面向对象语言处理错误的一种方

frame_c的博客 2335

银河麒麟硬盘健康检测:smartctl/badblocks实战与坏盘预判

xfs_repair检查。S.M.A.R.T检测。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 859

[转] boost库之异常处理

当你面对上千万行的项目时,当看到系统输出了异常信息时,你是否想过,如果它能将文件名、行号等信息输出,该多好啊,曾经为此绞尽脑汁。 今天使用boost库,将轻松的解决这个问题。 1、boost异常的基本用法 先看看使用STL中的异常类的一般做法: // 使用STL定义自己的异常 class MyException : public std::exception ...

PI2024的专栏 1142

MATLAB代码转到FPGA代码

添加完文件之后,需要设置输入的数据类型,设置完之后点击Workflow Advisor。MATLAB文件包含一个功能实现文件和测试文件。对应FPGA中的功能文件和测试文件。然后,将功能文件和测试文件添加到相应位置。然后选择APP中的HDL Coder代码。首先需要编写好MATLAB文件。点击链接,就可以查看你看到的代码。可以自己生成代码的语言类型。

小柚子的博客 3062

Oracle EBS AP 应付模块核心实现逻辑(极简骨架 + 分层拆解 + 业务流转 + 分录 + 核心表)

Oracle EBS AP应付模块采用四层逻辑架构:1)主数据层统一管控供应商基础信息;2)发票负债层通过三单匹配校验生成应付账款;3)付款核销层实现负债冲减;4)SLA层自动生成财务凭证。核心流程包括发票验证(匹配PO/收货单)、付款核销(全额/部分冲账)、会计分录自动生成(通过SLA引擎)。模块严格遵循"无匹配不负债、无验证不入账"原则,与采购、库存等模块深度集成,实现从供应商创建到付款核销的完整业务闭环,确保应付账款准确性和审计追溯能力。

金牌架构师 440

《C++11标准库》4.3差错和异常(Error and Exception)的处理

C++标准库由不同成分构成。来源不同,设计与实现的风格迥异。而差错处理和异常处理正是这种差异的典型表现特征。对于标准库中的一部分,例如 string class,支持具体的差错处理,它们检查所有可能发生的差错,并在差错发生时抛出异常。至于其它部分,例如 STL和 valarray,优先考虑执行效率而不是安全,因此几乎不检验逻辑差错,并且只在运行期发生差错时才抛出异常。 ...

weixin_60351940的博客 370

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

C++异常处理:从基础语法到RAII与标准异常体系的实战指南

异常处理是现代编程语言中用于管理运行时错误的核心机制,它通过分离正常业务逻辑与错误处理逻辑,提升代码的健壮性和可维护性。其基本原理是在程序执行过程中,当检测到异常情况时,通过抛出(throw)异常对象来中断当前流程,并由预先定义的捕获(catch)块进行集中处理,这一过程伴随着栈解退(stack unwinding)以确保资源的自动清理。该技术的核心价值在于能够优雅地处理文件I/O失败、内存分配不足、网络中断等不可预见的运行时问题,尤其适用于构建大型、复杂的工业级软件系统。在C++中,异常安全与RAII(R

a1311010193的博客 473

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

C++11异常处理机制深度解析:从noexcept到RAII的现代编程实践

异常处理是编程语言中处理运行时错误的核心机制,它通过分离正常代码路径和错误处理逻辑来提高代码的健壮性。在C++中,异常机制经历了重要演进,C++11标准引入了noexcept关键字和移动语义支持,显著提升了异常安全性和性能表现。这些改进使得异常处理从“可用但需谨慎”转变为更可靠的错误处理工具,特别适用于资源管理、并发编程和系统级开发等场景。通过RAII(资源获取即初始化)模式与noexcept优化,开发者可以构建具有强异常安全保证的组件,如标准库容器,确保在文件I/O失败或内存分配不足等异常情况下程序状态的

aome1470的博客 399

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

STL学习笔记 ---- 异常

作者: winterTTr (转载请注明)  资料来源:《STL标准库》   标准异常类  为了语言支持而使用的异常类bad_alloc :在new失败的时候,被抛出(除非使用nothrow版本的new)bad_cast  :在使用dynamic_cast转换“引用类型”失败的时候抛出bad_typeid:如果传给typeid操作

1046

如何设计一门语言(六)——exception和error code

我一直以来对于exception的态度都是很明确的。首先exception是好的,否则就不会有绝大多数的语言都支持他了。其次,error code也没什么问题,只是需要一个前提——你的语言得跟Haskell一样有monad和comonad。你看Haskell就没有exception,大家也写的很开心。为什么呢?因为只要把返回带error code结果的函数给做成一个monad/comonad,那么

GarfieldEr007的专栏 1055

C++进阶(07): 异常

文章主要介绍了 C 语言和 C++ 的错误处理机制:C 语言常用返回错误码,严重时终止程序。C++ 异常通过 throw、try、catch 实现,有特定抛出、捕获规则,可重新抛出,使用时要注意安全和规范。C++ 标准库异常以父子类层次组织。实际开发可选用标准库或自定义异常体系。异常利大于弊,工程中鼓励使用。

2401_86650143的博客 2141

C++异常处理进阶:系统标准异常原理、实战与最佳实践

在C++编程中,异常处理机制是构建健壮软件系统的核心技术之一。其核心原理是通过非本地跳转实现错误传播,相比传统错误码模式,能更清晰地分离正常逻辑与错误处理路径,提升代码可维护性。从技术价值看,异常机制与RAII(资源获取即初始化)范式深度结合,是实现异常安全、防止资源泄漏的关键。在实际应用场景中,标准库定义了一套完整的异常类继承体系,包括std::exception基类,以及logic_error、runtime_error等派生类,用于处理如越界访问、内存分配失败、类型转换错误等常见问题。理解并正确使用这

weixin_29698641的博客 279

SWIG跨语言异常处理完全指南:从原理到实战配置

在跨语言编程中,异常处理是确保系统健壮性的关键技术。其核心原理在于理解不同语言运行时模型的差异:C++基于栈回滚和类型化异常对象,而Python、Java等高级语言则拥有各自的原生异常机制。SWIG作为自动化包装生成器,其价值在于桥接这些异构系统,通过生成包装层代码,在C++函数调用点建立安全区,捕获并转换异常。这涉及类型系统映射、内存管理及错误信息传递等工程实践。应用场景广泛,尤其在将高性能C++核心库暴露给Python、Java等脚本语言时,能有效避免因未处理异常导致的进程崩溃或错误信息丢失。本文聚焦S

weixin_34008784的博客 401

(八)boost库之异常处理

(八)boost库之异常处理       当你面对上千万行的项目时,当看到系统输出了异常信息时,你是否想过,如果它能将文件名、行号等信息输出,该多好啊,曾经为此绞尽脑汁。       今天使用boost库,将轻松的解决这个问题。 1、boost异常的基本用法 先看看使用STL中的异常类的一般做法: // 使用STL定义自己的异常 class MyException : ...

weixin_34245749的博客 219

oracle异常处理

EXCEPTION WHEN OTHERS THEN –插入错误日志表 STV.PKG_STL_COMMON.PROC_STL_ERROR_LOG(P_PERIOD, V_BEGIN_DATE, V_

hmy_362322的博客 430
上一篇: getchar,scanf以及缓冲区的概念
下一篇: Shell 基本工作原理
wolfzone025
博客等级 码龄16年 35粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值