异常处理这是我在寒假期间看到过的一种c++机制,但是当时并未重视它,最近在网上看到了说企业开发中异常处理的重要性,故昨天看了些有关资料。
首先介绍一下异常处理机制。在程序中我们会碰到一些情况,比如除数为0,年龄键入为负数等。虽然可以用return语句实现函数的返回,但在c++中,它给我们提供了一种更有效的解决办法。即异常处理机制。它可以使异常的引发和异常的处理不必在同一个函数中。return仅仅可以返回到上一层函数,但是异常可以实现函数的跳层。
throw、try、和catch:
throw用于创建一个异常对象并抛出。此时需要有对应类型的catch去接,下面给出除数为0的基本异常处理代码:
#include "iostream"
using namespace std;
void divide(int x,int y)
{
if(0==y)
throw x;
else
{
cout<<x/y<<endl;
}
}
int main()
{
try{
divide(10,0);//第二个参数为0,引发异常,触发if语句抛出被除数
}
catch(int z)
{
cout<<z<<"can not be divide by 0"<<endl;//catch一个int型的异常对象,并做出处理
}
catch(...)//catch(...)用于捕捉其他类型的异常对象,该语句只能写在最后一个catch中
{
cout<<"error"<<endl;
}
cout<<"Hello"<<endl;
return 0;
}
上述代码中,介绍try的用法。
在我的理解中,任何可能触发异常的语句均应该写在一个try块中,其后接catch语句。在程序运行时,按正常顺序运行程序,若异常没触发,则自动忽略catch语句。
注意点:
抛出异常时,必须有对应的catch语句接这个异常,否则会报错。
#include "iostream"
using namespace std;
void divide(int x,int y)
{
if(0==y)
throw x;
else
{
cout<<x/y<<endl;
}
}
int main()
{
try{
divide(10,0);
}
/*catch(int z)
{
cout<<z<<"can not be divide by 0"<<endl;
}
catch(...)
{
cout<<"error"<<endl;
}*/
cout<<"Hello"<<endl;
return 0;
}
如以上代码中,将catch语句注释,则出现程序无法运行的情况,因为缺少相应的异常处理方法。
异常的抛出和处理可以跨函数:
#include "iostream"
using namespace std;
void divide(int x,int y)
{
if(0==y)
throw x;
else
{
cout<<x/y<<endl;
}
}
void my_divide()
{
divide(10,0);//引发异常
}
int main()
{
try
{
my_divide();//调用函数my_divide()
}
catch(int e)
{
cout<<"error "<<endl;
}
cout<<"Hello"<<endl;
return 0;
}
接到异常后可以选择不处理,但是应该继续抛出:
#include "iostream"
using namespace std;
void divide(int x,int y)
{
if(0==y)
throw x;
else
{
cout<<x/y<<endl;
}
}
void my_divide()
{
try{
divide(10,0);
}
catch(int e)
{
throw e;//接到异常但不处理,此时选择继续抛出该异常
}
}
int main()
{
try
{
my_divide();
}
catch(int e)
{
cout<<"error "<<endl;//此处处理异常。
}
cout<<"Hello"<<endl;
return 0;
}