zoukankan      html  css  js  c++  java
  • C++学习笔记9_异常处理

    异常处理

    int divide(int a,int b)

    {

      if(b==0)

      {

        return -1;//然而,10,-10也是结果-1,所以要抛出异常了

      }

    }

    //在异常不能通过返回值表示,也不能忽略(可能忘记对返回值进行处理)的情况下,需要抛出

    int divide(int a,int b)

    {

      if(b==0)

      {

        throw b;//随便抛一个东西出去?

        //注意,这里和C#不一样,C#的所有异常均继承Exception几类,而且是new Exception("error"),直接在托管堆上new

      }

    }

    int main()

    {

      try

      {

        divide(10,0);    

      }

      catch (int)//也可以为catch(int e),异常是根据类型匹配的,这里有点像C#(C# 是 catch(Excpetion e))

      {

        cout<<"除数为0"<<endl;

      }

    }

    *为了增强可读性,最好有专门的异常接口声明

    void func() throw(int,float,char);//这个函数,可能会抛出int,float,char类型的异常。

    void func() throw();//不抛出任何异常

    *catch(...)//三个点,捕获所有异常,注意,捕获所欲异常,是指能抛出的异常,有些访问越界这样的错误,是没办法捕获,直接挂了的。

    注意:

    抛出异常,其实和返回一个类型值差不多,所以,也有构造,拷贝,析构的过程。所以,自定义异常类,要做好构造、拷贝、析构的工作。

    特别是,有char* errorMsg;这样子的。

    throw MyException("aaaa");

    catch(MyException &e);//也可以通过引用来接,虽然MyException也属于局部变量,讲道理,执行完函数就析构了,但是,使用catch来接,会在处理完异常,才销毁。这样,就不用执行拷贝构造了

    注意:

    不要throw  & (MyException("aaaa"))指针,因为如果不是抛出引用,出了方法后,会立刻析构掉!!!

    除非 throw new  MyException("aaaa");

    并且

    catch(MyException *e)

    {

      delete e;

    }

    * C++有标准的异常基类,叫exception,还有其他派生的异常类。

    #include<stdexcept>//标准异常类

    throw out_of_range("超出数组界限");//不需要重写什么函数

  • 相关阅读:
    下定决心
    SPFA
    Linux下一些常用的命令
    如何设计符合RESTful风格的API
    django中的第三方:富文本编辑器和itsdangerous加密
    redis主从
    redis集群
    django中关联(一对多)查询的两种方式,理一理
    关于Django中的迁移文件
    日常工作中Git的正确使用姿势
  • 原文地址:https://www.cnblogs.com/pylblog/p/9828477.html
Copyright © 2011-2022 走看看