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