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("超出数组界限");//不需要重写什么函数

原文地址:https://www.cnblogs.com/pylblog/p/9828477.html