(C++)异常处理

1、异常的概念

异常处理就是处理程序中的错误,错误就是程序在运行期间发生的一些异常事件,(栈溢出,转换失败,数组下标越界等)。

2、异常的语法

throw:抛出异常 , 代替return语句

try         //检查可能发生异常的语句

{

...........

}

catch      //铺获异常

{
...........
}

3、异常处理实例

除0自然会产生异常

#include <iostream>
using namespace std;

int Div(int x,int y)
{
    if(0 == y)
    {
        throw 0;         //抛出异常
    }
    return x / y;
}
int main(int argc, char const *argv[])
{
    int a,b;
    cin >>a>>b;
    try             //把可能发生异常的语句放在try语句中
    {
        cout<<Div(a,b)<<endl;
    }
    catch(int)
    {
        cout<<"int exception"<<endl;
    }
    printf("helloworld\n");
    return 0;
}

4、异常的思想

#include <iostream>
using namespace std;
int Div(int x,int y)
{
    return DDiv(x,y);
}
int DDiv(int x,int y)
{
    if(0 == y)
    {
        //throw 0;            //抛出异常
        throw 'a';            //抛出异常
    }
    return x / y;
}
int main(int argc, char const *argv[])
{
    int a,b;
    cin>>a>>b;
    try
    {
        cout<<Div(a,b)<<endl;
    }
    catch(int)                       //接受整形异常
    {
        cout<<"int exception"<<endl;
    }
    catch(char)                      //接受字符型异常
    {
        cout<<"char exception"<<endl;
    }
    return 0;
}

5、异常的声明

#include <iostream>
using namespace std;
//int Div(int x,int y);   //可能抛出任何异常
//int Div(int x,int y) throw(int,char);    //只能输出int,char类型的异常
int Div(int x,int y) throw();   //不会输出任何异常
int main(int argc, char const *argv[])
{
    int a,b;
    cin>>a>>b;
    try
    {
        cout<<Div(a,b)<<endl;
    }
    //printf("hellworodl");
    catch(int)
    {
        cout<<"int exception"<<endl;
    }
    catch(char)
    {
        cout<<"char exception"<<endl;
    }    
    return 0;
}
int Div(int x,int y) throw()
{
    if(0 == y)
    {
        //return -1;
        //throw 0;   //抛出异常
        throw 'a';
    }
    return x / y;
}

6、异常对象

#include <iostream>
using namespace std;
class Test
{
    public:
        Test()
        {
            cout<<"Test的构造函数"<<endl;
        }
        Test(const Test &t)
        {
            cout<<"Test的拷贝构造函数"<<endl;
        }
        void print()
        {
            cout<<"Test Exception"<<endl;
        }
        ~Test()
        {
            cout<<"Test的析构函数"<<endl;
        }
};
int Div(int x,int y)
{
    if(0 == y)
    {
        //throw 0;          //抛出异常
        //throw Test();    //抛出对象
        throw new Test;   //抛出对象指针
    }
    return x / y;
}
int main(int argc, char const *argv[])
{
    int a,b;
    cin>>a>>b;
    try
    {
        cout<<Div(a,b)<<endl;
    }
    catch(Test &t)       //接受对象
    {
        t.print();
    }
    catch(Test *t)         //接受对象指针
    {
        t->print();
        delete t;        //需要手动释放
    }
    return 0;
}

7、标准异常库

c++提供了一组标准异常类,这些类以基类exception开始,标准程序库中抛出的所有异常都派生于该基类

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

//exception 提供的一个虚函数 what() 用来返回错误信息

exception--->bad_alloc, bad_cast, bad_typeid, over_flow, logic_error

//bad_alloc : new 或者 new[ ] 分配内存失败抛出异常

//bad_cast : dynamic_cast 转换失败抛出异常

//bad_typeid : typeid 操作空指针,而且该指针带有虚函数的类,抛出异常

//over_fiow: 计算错误(上溢),抛出异常

//logic_error :逻辑错误,有派生类 out_of_range 超出有效范围  

#include <iostream>
#include <exception>
using namespace std;
int func(int *a,int index)
{
    if(index > 2)
    {
        throw out_of_range("index不能小于2");
    }
}
int main(int argc, char const *argv[])
{
    int a[3] = {1,2,3};
    try
    {
        func(a,10);
    }
    catch(const std::exception& e)
    {
       cout<<e.what()<<endl;
    }
    
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值