c++中的异常机制

简介

throw:抛,在出错的地方抛出异常信息。
try:尝试捕获throw抛出的异常信息。
catch:有个参数用来接收捕获的异常信息(参数类型需和抛出的错误信息类型保持一致)
catch(…):捕获所有异常信息

#include<iostream>
using namespace std;

int divide(int numOne,int numTwo)
{
    if (0 == numTwo)
        throw "除数不能为零";        //抛出char*型的异常信息,一旦抛出异常就会直接跳出。
    else
        return numOne / numTwo;
}

int main() {

    try {
        divide(3, 0);
    }
    catch (char* e)      //捕获异常信息(也为char*型)
    {
        cout << e << endl;
    }
    system("pause");
    return 0;
}


运行结果:
这里写图片描述


异常信息抛的方式
在函数一层层的调用之后会形成栈的结构,异常信息会从抛出它的地方一层层往上抛,每网上抛一层,前一个抛它的函数所被分配的栈区就会被随之回收,直到被catch到,如果用户没有写catch语句,这些异常信息最终会被编译器捕获。

#include<iostream>
using namespace std;
void Foo3()
{
    throw "foo3";
}
void Foo2()
{
    Foo3();
}
void Foo1()
{
    Foo2();
}
int main() {

    try {
        Foo1();
    }
    catch (char* e)      
    {
        cout << e << endl;
    }
    system("pause");
    return 0;
}


运行结果:

这里写图片描述
这里写图片描述


c++用于异常处理的类

这里写图片描述

exception :基类
    runtime_error:运行时错误
        overfloe_error:算术溢出错误
        range_error:范围出现错误
        underflow_error:堆栈上溢
    logic_error:逻辑错误,语法错误
        invalid_argument :不存在的参数
        length_error:要表示的字符串的长度过过长, 超出所能表示的最大限制
        out_of_range :超出范围
    bad_alloc:分配空间时出错
    bad_cast:类型转换出错时

具体请点击查看文档

注意


不到万不得已不要抛回指针,因为可能抛出的指针指向的是栈区,而异常信息的抛出会随之会回收栈区,导致指针变为非法访问。

一般定义自己的异常类会继承类exception,在捕获异常时也要记得把对自己异常类的捕获写在对系统默认异常类的捕获前面,因为基类指针可以指向派生类对象,派生类指针不能指向基类对象,这样可以优先获取到自己定义的异常信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值