首页 > 编程语言 >C++异常处理

C++异常处理

时间:2023-09-01 20:55:05浏览次数:51  
标签:__ string 处理 抛出 C++ func 类型 异常

一、异常处理

  • 程序的错误大致分三种:语法错误、逻辑错误、运行时错误

  • 运行时错误发生在程序运行期间发生的问题:除零、内存分配失败、非法访问内存、文件不存在、数组越界

  • C++的异常处理机制就是为了解决运行时错误

  • C语言中运行时错误如果不管,系统会执行默认操作,可能会让程序终止产生崩溃,也可能不终止,但是运行结果不正确

  • C++提供的异常处理机制,能够捕捉到运行时错误,至少提供了告诉调用者发生了什么事情导致终止的方式,然后再终止

二、如何抛异常

throw 数据;    
  • 数据可以是任意类型

  • 不要抛出局部变量的地址,因为该地址有可能被释放

  • 抛出的数据不是直接传递给捕获的变量,而是先创建一个匿名对象存储该数据,然后传递该匿名对象

三、如何捕获异常

try{
    //可能会产生异常的代码或函数调用
}catch(类型1& 变量名){
    //进行异常处理1
}catch(类型2& 变量名){
    //进行异常处理2
}···
  • 如果使用 ’类型 变量名 ‘ 方式捕获异常,会对匿名对匿名对象再拷贝一次,浪费资源时间,所以一般使用引用获取该匿名对象,可以减少一次拷贝

四、异常说明(异常规范)

返回值 函数名(形参列表)[异常说明throw (类型名1,类型名2)]
{

}
例如:
void func(void)throw(类型1,类型2)
void func(void)throw()    //表示不抛异常
  • 异常说明相当于该函数的限制或承诺,只抛出说明过的异常类型,如果抛出说明外的类型,可以抛出,但是不能接住

  • 不同编译器对异常说明的实现不同,有的听从,有的不听从

  • 异常说明是C++98的一项功能,C++11后就抛弃了,不建议使用

  • C++11中使用 void func(int x) noexpect 替代

五、标准异常

  • C++已经定义好的异常类,当对应的异常发生时,会自动地抛出定义好的对应的异常类对象

  • std::exception  所有标准异常类的父类,能够捕获所有的标准异常

  • std::bad_alloc  new分配内存失败时抛出的异常,std::bad_array_new_length 是它的子类 new分配内存数量有误会抛出

  • std::bad_cast  该异常可以通过 dynamic_cast 抛出

    需要#include < typeinfo >

  • std::bad_typeid 该异常可以通过typeid 抛出

    • 当获取具有多态属性的类型指针解引用的类型时,如果不能确定解引用后是哪个类型时,会抛出该异常

      Base* b = new Base;
      Base* b1 = new Son;
      Base* b2 = NULL;
      typeid(*b);      //类型 Base
      typeid(*b1);     //类型 Son
      typeid(*b2);     //抛异常
      

六、自定义异常类

通过设计一个继承了exception的异常类,可以个性化地抛出想要的异常

#define ZZERROR(...) ZZError(__TIME__,__FILE__,__func__,__LINE__,__VA_ARGS__)

class ZZError : public exception
{
    string time;
    string file;
    string func;
    size_t line;
    string error;
public:
    ZZError(const string& time,const string& file,const string& func,size_t line,const string& error):time(time),file(file),func(func),line(line),error(error){}
    ~ZZError(void){}

    const string& what(void)
    {
        return error;
    }

    friend ostream& operator<<(ostream& os,const ZZError& err)
    {
        return os << "time:" << err.time << " file:" << err.file <<" func:" << err.func << " line:" << err.line << " error:" << err.error;
    }
};

七、使用异常需要注意的问题

  1. 不要抛出局部变量、对象的地址,而是抛出变量、对象本身

  2. 建议使用引用的方式来捕获异常,减少一次拷贝

  3. 不要在构造函数、析构函数中抛异常

  4. 在捕获异常时,先捕获子类类型,再捕获父类类型

标签:__,string,处理,抛出,C++,func,类型,异常
From: https://www.cnblogs.com/wangqiuji/p/17672829.html

相关文章

  • C++模板
    一、类型信息运算符typeid在C++中typeid可以获取数据的类型,但是需要加头文件typeinfofind/usr/include-nametypeinfotypeid是运算符,执行运算符函数,执行的返回类型是type_info类类型对象type_info中有个name的成员函数type_info中还重载了==运算符,可以直接比较......
  • Python学习 -- 异常堆栈追踪技术
    在编写Python代码时,出现异常是不可避免的。异常堆栈追踪是一种强大的工具,可以帮助我们定位错误发生的位置以及调用栈信息。Python的traceback模块提供了多种方法来获取和展示异常的堆栈信息。本文将详细介绍traceback模块中的print_exc()方法,帮助你更好地理解异常堆栈的追踪技术。t......
  • 标准C++ -- day09
    一、智能指针常规指针的缺点:当一个常规指针离开了作用域时,只有该指针变量本身占用的内存空间(4/8字节)会被释放,而它指向的内存空间不会自动释放,当free、delete、delete[]语句忘记执行或者无法执行,形成内存泄漏如何定位内存泄漏、如何预防内存泄漏智能指针的优点:......
  • ETM5900谈谈用java处理excel问题
    ETM5900  Assignment1Question1[Total23Marks]Agroupofresearchersareinterestedinstudyingtheprevalenceofobesity,diabetes,andothercardiovascularriskfactorsinSubangJaya,Selangor.Togainmoreinsightintothisquestion,1150subjectswe......
  • 探索C++非质变算法:如何更高效地处理数据
    前言......
  • c++IO流——开工啦
    ......
  • 解决Ubuntu 安装出现E: Sub-process /usr/bin/dpkg returned an error code (1)异常(轮
     cd/var/lib/dpkg/sudomvinfo/info.bak#现将info文件夹更名sudomkdirinfo#再新建一个新的info文件夹sudoapt-getupdate#更新sudoapt-get-finstall#修复sudomvinfo/*info.bak/#执行完上一步......
  • 视频监控平台EasyCVR如何处理无法探测到对应设备的情况
    EasyCVR安防协议视频综合管理系统在研发初期就以"全能型"平台为目标进行设计,支持各种私有协议接入,并且提供了Onvif探测功能。采用Onvif协议的优势在于,终端用户和集成商可以选择不同制造商的技术和解决方案。该协议的支持大大拓展了EasyCVR的适用范围,使其具备更广泛的应用性。在局域......
  • 关于处理 vue data中对象或数组中响应式数据的注意点
    vue2中针对对象中的响应式数据,如果要想修改他们,只能通过监听的特性实现。不能直接赋值。在vue2源码中,计算属性和watch的实现方式是一样的,都具有监听响应式对象或数组中的数据的功能。区别就是,计算属性具有缓存机制。除此之外,还可以直接使用this.$set(obj,key:String,value......
  • 【MySQL】MySQL主从复制延迟原因及处理思路
     MySQL主从复制延迟原因及处理思路主库DML请求频繁(TPS较大)主库写请求较多,有大量insert、delete、update并发操作,短时间产生了大量的binlog【原因分析】主库并发写入数据,而从库SQLThread为单线程应用日志,很容易造成relaylog堆积,产生延迟。【解决思路】做sharding,通过s......