zoukankan      html  css  js  c++  java
  • C++异常处理(一)----基本语法

    • 实验环境 win7 下的vs2017,基本原则:throw抛出的数据类型,和cathc语句的数据类型要一致
    • 异常的引发和异常的处理可以分布在不同函数中,所以c++的异常是跨栈的
    • 异常是由“地地道道“的错误所引发
    #define _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include<string.h>
    using namespace std;
    
    void testerror(int x,int y)
    {
    
        if (y==0)
        {
            throw x;
        }
        cout << "计算结果:"<<x/y<< endl;
    }
    
    void main()
    {
        try
        {
            testerror(100,0);
        }
        catch (int x)
        {
            cout  << x << "不能被0整除" << endl;
        }
        catch (...)
        {
            cout << "无言的结局" << endl;
        }
        system("pause");
    }
    • 下面的例子揭示了throw语句的强大,无论多少层都会抛出错误
    void testerror(int x,int y)
    {
    
        if (y==0)
        {
            throw x;
        }
        cout << "计算结果:"<<x/y<< endl;
    }
    
    void awrap()
    {
        testerror(100, 0);
    }
    
    void main()
    {
        //
        try
        {
            awrap();
        }
        catch (int x)
        {
            cout  << x << "不能被0整除" << endl;
        }
        catch (...)
        {
            cout << "无言的结局" << endl;
        }
        system("pause");
    }

    输出结果:

    •  一个字符串比较的例子
    void testerror(char * name)
    {
        cout << "his name is " << name << endl;
        if (strcmp(name,"雨化田")==0)
        {
            throw name;
        }
        cout << "原来是:" << name << "!快快进来享用广式炒面" << endl;
    }
    
    int main()
    {
        //
        char name[] = "雨化田";
        char *hisname = name;
        try
        {
            testerror(hisname);
        }
        catch (char *name)
        {
            cout << "妈爷子诶~这不是:" << name << endl;
        }
        catch (...)
        {
            cout << "无言的结局" << endl;
        }
        system("pause");
        return 0;
    }

    输出结果:

    • 栈解旋(unwinding):当异常抛出为栈对象时,异常处理可以达到析构异常对象的效果
    #include<iostream>
    using namespace std;
    
    class mycoach
    {
    public:
        friend void freeobj(mycoach &t);
        mycoach(char *myname, int age,int months)
        {
            this->myname = myname;
            this->age = age;
            this->months = months;
        }
        ~mycoach()
        {
            cout << "free of space" << endl;
        }
    private:
        char *myname;
        int age;
        int months;
    };
    
    void freeobj(mycoach &t)
    {
        if (t.age < 16)
        {
            cout <<"精神可嘉~但还是年龄太小" <<endl;
            throw t.age;
        }
        if (t.months <= 12)
        {
            cout << "精神可嘉~再练一段时间,加油" << endl;
            throw t.months;
        }
        //throw t;
    }
    
    
    void main() 
    {
        char name[] = "章小军";
        char *hisname = name;
        mycoach mt(hisname,16,1);
        try
        {
            freeobj(mt);
        }
        catch (int a)
        {
            cout << "少于规定训练时间(12个月)实际:"<<a <<"个月"<< endl;
        }
        catch (...)
        {
            cout << "无言的结局" << endl;
        }
        system("pause");
        //return 0;
    }

    输出结果:

     其中,按下任意键之后,执行了析构函数也就是所谓的”栈解旋“

  • 相关阅读:
    360安全桌面的屏保图片在哪个目录下?
    IntelliJ 注解@Slf4j后找不到log问题解决
    运行springboot项目报错:Field userMapper in XX required a bean of type 'xx' that could not be found.
    springsecurity
    Error creating bean with name 'sqlSessionFactory' defined in class path resource [config/spring/applicationContext.xml]: Invocation of init method failed;
    idea热部署
    数据结构导论 三 线性表-顺序存储
    数据结构导论 二 时空性
    树莓派安装、卸载、更新软件
    数据结构导论第一章
  • 原文地址:https://www.cnblogs.com/saintdingspage/p/12079491.html
Copyright © 2011-2022 走看看