C++中的异常处理机制以及异常规范

C++中的异常处理机制以及异常规范

如下代码运行环境为64位系统下的VS2013

C++中的异常状况:

语法错误(编译错误):好比变量未定义、括号不匹配、关键字拼写错误等等编译器在编译时能发现的错误,这类错误能够及时被编译器发现,并且能够及时知道出错的位置及缘由,方便改正。

运行时错误:好比数组下标越界、系统内存不足等等。这类错误不易被程序员发现,它能经过编译且能进入运行,但运行时会出错,致使程序崩溃。
为了有效处理程序运行时错误,C++中引入异常处理机制来解决此问题。

C++异常处理机制:

异常处理基本思想:执行一个函数的过程当中发现异常,能够不用在本函数内当即进行处理, 而是抛出该异常,让函数的调用者直接或间接处理这个问题。

C++异常处理机制由3个模块组成:
try(检查)、throw(抛出)、catch(捕获)

抛出异常的语句格式为:throw 表达式;若是try块中程序段发现了异常则抛出异常。

try
{
可能抛出异常的语句;(检查)
}
catch(类型名[形参名])//捕获特定类型的异常
{
//处理1;
}
catch(类型名[形参名])//捕获特定类型的异常
{
//处理2;
}
catch(…)//捕获全部类型的异常
{
}

栈展开:

有四个函数f1(),f2(),f3(),f4(),
在f2()中调f1(),f3调()f2(),f4()调f3(),
main()调f4(),并在f1()抛出一个异常,在main()用catch语句捕获。栈展开过程以下:

在这里插入图片描述

参考代码:

void f1(int i)
{
    if (i<0)
    throw 1;
}
void f2()
{
    f1(-45);
}
void f3()
{
    f2();
}
void f4()
{
    f3();
}
int main()
{
    try{
        f4();
    }
    catch (int i)
    {
        cout <<"error code:"<< i <<"\n"<< endl;
    }
    system("pause");
    return 0;
}

运行结果:

在这里插入图片描述

异常捕获的匹配规则:

try 块里面抛出那种类型的异常,则catch里面捕获哪一种类型的异常,通常状况下,类型必须彻底匹配,但如下3种状况能够进行类型转换:

一、容许从非const对象到const的转换。
即throw 1个非const对象,catch 1个const对象

二、容许从派生类类型到基类类型的转换。
即throw 1个派生类对象,catch 1个基类对象

三、将数组转换为指向数组类型的指针,函数转换为指向函数类型的指针。
异常的从新抛出:

参考代码以下:

void fun(int i)
{
    if (i < 0)
        throw - 1;
}
void fun2()
{
    try
    {
        fun(-23);
    }
    catch (int i)
    {
        cout << "errcode:" << i << "\n";
    }
}
int main()
{
    fun2();
    system("pause");
    return 0;
}

运行结果:
在这里插入图片描述
运行上述代码,咱们只能知道程序有错,从新抛出后,咱们不只知道程序有错还能够知道错误缘由,这样便于及时改正。
参考代码以下:

void fun(int i)
{
    if (i < 0)
        throw - 1;
}
void fun2(int i)
{
    try
    {
        fun(i);
    }
    catch (int i)
    {
        switch (i)
        {
        case -1;
            throw "数据越界";//从新抛出
        }
    }
}
int main()
{
    try
    {
        fun2(-34);
    }
    catch (const char *s)
    {
        cout << "error code:" << s<<"\n" << endl;
    }
    system("pause");
    return 0;
}

运行结果:
在这里插入图片描述

异常规范:

函数声明以后,列出该函数可能抛出异常类型,并保证该函数不会抛出其余类型的异常。

一、参考代码以下:

void fun1()throw(int)     //代表只能抛出int型异常
{
    throw '1';
}
int main()
{
    fun1();
    system("pause");
    return 0;
}

编译时出现警告:忽略异常

在这里插入图片描述
二、若是以常规范为throw(),表示不得抛出任何异常

异常与构造函数和析构函数:

一、保证不在构造函数中抛出异常,由于构造函数的做用是构造对象并初始化,一旦抛出异常,有可能致使对象不完整或没有彻底初始化。

二、保证不在析构函数中抛出异常,由于析构函数的做用是完成资源的清理,一旦抛出异常,有可能致使资源泄漏(内存泄漏等等)。

重点:不在构造函数和析构函数中抛出异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值