首页 > 其他分享 >异常

异常

时间:2023-02-21 10:26:59浏览次数:36  
标签:typeid cast 引用 catch 异常 throw

1)try、throw和catch关键字

  • 在程序中的用法如下
#include <iostream>
using namespace std;
int main()
{
    double m = 1, n = 0;
    try {
        cout << "before dividing." << endl;
        if (n == 0)
            throw - 1;  //抛出int型异常
        else if (m == 0)
            throw - 1.0;  //拋出 double 型异常
        else
            cout << m / n << endl;
        cout << "after dividing." << endl;
    }
    catch (double d) {
        cout << "catch (double)" << d << endl;
    }
    catch (...) {
        cout << "catch (...)" << endl;
    }
    cout << "finished" << endl;
    return 0;
}
//运行结果
//before dividing.
//catch (...)
//finished
  • 程序的执行流程是先执行try包裹的语句块,如果执行过程中没有异常发生,则不会进入任何catch包裹的语句块
  • 如果发生异常,则使用throw进行异常抛出,再由catch进行捕获
  • throw可以抛出各种数据类型的信息,代码中使用的是数字,也可以自定义异常class
  • 可以使用catch(...)的方式捕获任何异常(不推荐)
  • 如果catch了异常,当前函数如果不进行处理,或者已经处理了想通知上一层的调用者,可以在catch里面再throw异常。

2)函数的异常声明列表

  • 程序员在定义函数的时候知道函数可能发生的异常,可以在函数声明和定义时,指出所能抛出异常的列表
int fun() throw(int,double,A,B,C){...};
  • 表名函数可能会抛出int,double型或者A、B、C三种类型的异常

3)C++标准异常类 exception

  • C++ 标准库中有一些类代表异常,这些类都是从 exception 类派生而来
  • bad_typeid:使用typeid运算符,如果其操作数是一个多态类的指针,而该指针的值为 NULL,则会拋出此异常
  • bad_cast:在用 dynamic_cast 进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常
  • bad_alloc:用 new 运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常
  • out_of_range:用 vector 或 string的at 成员函数根据下标访问元素时,如果下标越界,则会拋出此异常

typeid

  • 在揭开typeid之前,需先了解RTTI(Run-Time Type Identification,运行时类型识别)
    • 它使程序能够获取由基指针或引用所指向的对象的实际派生类型
    • 允许“用指向基类的指针或引用来操作对象”的程序能够获取到“这些指针或引用所指对象”的实际派生类型。
  • 在C++中,为了支持RTTI提供了两个操作符:dynamic_cast和typeid
    • dynamic_cast允许运行时刻进行类型转换,从而使程序能够在一个类层次结构中安全地转化类型
    • 相对应的还有一个非安全的转换操作符static_cast
    • typeid操作符的返回结果是名为type_info的标准库类型的对象的引用
  • typeid 会把获取到的类型信息保存到一个 type_info 类型的对象里面,并返回该对象的常引用

标签:typeid,cast,引用,catch,异常,throw
From: https://www.cnblogs.com/xiaoqing-ing/p/17139983.html

相关文章

  • Java异常机制
    异常机制代码实际编写后并不一定是完美的,可能会有我们没有考虑到的情况异常类型之前其实已经接触过一些异常了,比如数组越界异常,空指针异常等,这些错误都是异常类型,每一......
  • springmvc异常处理
    1 DispatcherServlet的handlerExceptionResolvers在DispatcherServlet初始化过程中,执行如下初始化方法protectedvoidinitStrategies(ApplicationContextcontext......
  • python爬虫学习——文件操作,异常处理
    文件操作'''f=open("a.txt","w")#打开一个文件,w模式(写),如果文件不存在就在当前目录下创建f.write("helloworld,iamhere")#将字符串写入文件中f.cl......
  • 异常
    异常什么是异常软件程序在运行过程中,非常可能遇到异常,Exception---例外异常指程序运行中出现的不期而至的各种状况异常发生在程序运行期间,它影响了正常的程序执行流......
  • golang 入门(十) 异常处理
    1、recovery捕获异常代码在运行的时候,总会遇到错误。有的时候我们会希望程序遇到错误以后继续运行后面的流程,而不是直接异常退出。在Python中,使用tryexcept组合实现这种需......
  • Spring-Boot捕获处理异常并让事务回滚
    1.不捕获异常可以正常回滚@Transactional(rollbackFor=Exception.class)@OverridepublicbooleantestTransaction(){baseMapper.updateById(......
  • python系列 - 异常处理
    错误与异常通常来说,程序中的错误至少包含两种:一种是语法错误,另一种则是异常语法错误:代码不符合编程规范,无法被识别与执行异常:程序语法正确且可以被执行,但执行过程中遇到......
  • opengauss节点异常无法启动-记录
    问题描述:Opengauss1主2备环境,反馈数据库连不上了查看原主一直在starting主备断了,新主只和omm3有链接后台不停拉起宕掉问题处理:手动停止omm1,并拉起,数据节点的日志......
  • 异常02-捕获和抛出异常
    异常处理机制抛出异常捕获异常异常处理的5个关键字:try、catch、finally、throw、throwspackagecom.exception.demo01;publicclassDemo01{publicstat......
  • 异常03自定义异常和经验小结
    自定义异常使用Java内置的异常类可以描述在编程时出现的大部分异常情况。除此之外,用户还可以自定义异常。用户自定义异常类,只需继承Exception类即可在程序中使用自定义......