C++的异常处理
2013-07-20 12:08
155 查看
程序中常见的错误有两种:语法错误和运行时错误
语法错误一般在编译的时候会给出提示,但是运行时错误则不是那么容易发现的。有的甚至能正常运行,但是不能给出正确的结果,或者程序非正常终止,或者导致死机。
因此,所有导致出现这些非正常情况的都属于异常。在程序中我们要自己给出相应的异常处理机制,来避免出现自己未预料到的结果。
C++给出的异常处理机制由三部分组成:检查(try)、抛出(throw)、捕捉(catch)。
把需要检查的语句放在try块中,throw用来在出现异常的时候发出一个异常信息,catch用来捕捉这个信息,如果捕捉到了,就处理它。
语法:
throw 语句一般是由throw运算符和一个数据组成的,形式为 throw 表达式
try-catch结构为
try
{
要检查的语句块;
}
catch (异常信息类型 [变量名])
{
处理异常的语句;
}
说明:
(1)被检查语句必须放在try语句块中,否则不起作用
(2)try和catch必须放在一起,中间不能隔其他的语句。也可以只有try,没有catch,表示只检查异常,并不做处理。
(3)try和catch的语句块必须用花括号括起来,即使只有一个语句也不能省略。
(4)一个try-catch结构中,可以只有一个try,但可以有很多catch块,来匹配不同的异常类型。
(5)catch后面的小括号中,一般只写异常信息的类型名,如catch(double)。catch只检查异常信息的类型,而不检查他们的值。
因此,如果要捕捉不同的异常类型,应当由throw抛出不同的异常类型。另外,catch后面的小括号里也可以指定变量名,这样
在throw抛出异常时若指定了变量,可以由catch指定的变量来获取异常变量的拷贝。以便于后面对该异常信息的需要。
(6)若catch后面的小括号中没有类型名,只有...。即catch(...),表示可以捕捉到任何类型的异常。这种catch子句应该放在try-catch结构的
最后,表示捕捉到异常的其他情况。否则,其他的catch将不起作用。
(7)try-catch结构可以出现在同一个函数中,也可以不出现在同一个函数中。在异常出现的时候,系统会自动先在本函数中寻找匹配的catch,
如果找不到匹配的,则会去距离该try最近的catch寻找匹配,直到找到匹配的catch结构。
(8)在有些情况下,throw可以不包括任何表达式,表示我不处理这个异常,交给上级函数去处理。
(9)如果throw抛出的异常找不到匹配的catch子句去处理,则系统会调用一个系统函数terminate,使程序终止运行。
例子
#include <iostream>
using namespace std;
intmain( )
{void f1( );
try
{f1( );}//调用f1( )
catch(double)
{cout<<″OK0!″<<endl;}
cout<<″end0″<<endl;
return 0;
}
void f1( )
{void f2( );
try
{f2( );} // 调用f2( )
catch(char)
{cout<<″OK1!″;}
cout<<″end1″<<endl;
}
void f2( )
{void f3( );
try
{f3( );} // 调用f3( )
catch(int)
{cout<<″Ok2!″<<endl;}
cout<<″end2″<<endl;
}
void f3( )
{double a=0;
try
{throw a;} //抛出double类型异常信息
catch(float)
{cout<<″OK3!″<<endl;}
cout<<″end3″<<endl;
}
程序运行结果如下:
OK0!(在主函数中捕获异常)
end0 (执行主函数中最后一个语句时的输出)
如果将f3函数中的catch子句改为
catch(double),而程序中其他部分不变,则程序运
行结果如下:
OK3!(在f3函数中捕获异常)
end3 (执行f3函数中最后一个语句时的输出)
end2 (执行f2函数中最后一个语句时的输出)
end1 (执行f1函数中最后一个语句时的输出)
end0 (执行主函数中最后一个语句时的输出)
如果在此基础上再将f3函数中的catch块改为
catch(double)
{cout<<″OK3!″<<endl;throw;}
程序运行结果如下:
OK3!(在f3函数中捕获异常)
OK0! (在主函数中捕获异常)
end0 (执行主函数中最后一个语句时的输出)
语法错误一般在编译的时候会给出提示,但是运行时错误则不是那么容易发现的。有的甚至能正常运行,但是不能给出正确的结果,或者程序非正常终止,或者导致死机。
因此,所有导致出现这些非正常情况的都属于异常。在程序中我们要自己给出相应的异常处理机制,来避免出现自己未预料到的结果。
C++给出的异常处理机制由三部分组成:检查(try)、抛出(throw)、捕捉(catch)。
把需要检查的语句放在try块中,throw用来在出现异常的时候发出一个异常信息,catch用来捕捉这个信息,如果捕捉到了,就处理它。
语法:
throw 语句一般是由throw运算符和一个数据组成的,形式为 throw 表达式
try-catch结构为
try
{
要检查的语句块;
}
catch (异常信息类型 [变量名])
{
处理异常的语句;
}
说明:
(1)被检查语句必须放在try语句块中,否则不起作用
(2)try和catch必须放在一起,中间不能隔其他的语句。也可以只有try,没有catch,表示只检查异常,并不做处理。
(3)try和catch的语句块必须用花括号括起来,即使只有一个语句也不能省略。
(4)一个try-catch结构中,可以只有一个try,但可以有很多catch块,来匹配不同的异常类型。
(5)catch后面的小括号中,一般只写异常信息的类型名,如catch(double)。catch只检查异常信息的类型,而不检查他们的值。
因此,如果要捕捉不同的异常类型,应当由throw抛出不同的异常类型。另外,catch后面的小括号里也可以指定变量名,这样
在throw抛出异常时若指定了变量,可以由catch指定的变量来获取异常变量的拷贝。以便于后面对该异常信息的需要。
(6)若catch后面的小括号中没有类型名,只有...。即catch(...),表示可以捕捉到任何类型的异常。这种catch子句应该放在try-catch结构的
最后,表示捕捉到异常的其他情况。否则,其他的catch将不起作用。
(7)try-catch结构可以出现在同一个函数中,也可以不出现在同一个函数中。在异常出现的时候,系统会自动先在本函数中寻找匹配的catch,
如果找不到匹配的,则会去距离该try最近的catch寻找匹配,直到找到匹配的catch结构。
(8)在有些情况下,throw可以不包括任何表达式,表示我不处理这个异常,交给上级函数去处理。
(9)如果throw抛出的异常找不到匹配的catch子句去处理,则系统会调用一个系统函数terminate,使程序终止运行。
例子
#include <iostream>
using namespace std;
intmain( )
{void f1( );
try
{f1( );}//调用f1( )
catch(double)
{cout<<″OK0!″<<endl;}
cout<<″end0″<<endl;
return 0;
}
void f1( )
{void f2( );
try
{f2( );} // 调用f2( )
catch(char)
{cout<<″OK1!″;}
cout<<″end1″<<endl;
}
void f2( )
{void f3( );
try
{f3( );} // 调用f3( )
catch(int)
{cout<<″Ok2!″<<endl;}
cout<<″end2″<<endl;
}
void f3( )
{double a=0;
try
{throw a;} //抛出double类型异常信息
catch(float)
{cout<<″OK3!″<<endl;}
cout<<″end3″<<endl;
}
程序运行结果如下:
OK0!(在主函数中捕获异常)
end0 (执行主函数中最后一个语句时的输出)
如果将f3函数中的catch子句改为
catch(double),而程序中其他部分不变,则程序运
行结果如下:
OK3!(在f3函数中捕获异常)
end3 (执行f3函数中最后一个语句时的输出)
end2 (执行f2函数中最后一个语句时的输出)
end1 (执行f1函数中最后一个语句时的输出)
end0 (执行主函数中最后一个语句时的输出)
如果在此基础上再将f3函数中的catch块改为
catch(double)
{cout<<″OK3!″<<endl;throw;}
程序运行结果如下:
OK3!(在f3函数中捕获异常)
OK0! (在主函数中捕获异常)
end0 (执行主函数中最后一个语句时的输出)
相关文章推荐
- c++_10: 异常处理
- 解决C++/CLI中关于“MissingManifestResourceException类型的未经处理的异常出现在mscorlib.dll”问题一例
- C++利用new_handler()函数处理异常
- 巧用 c++ 异常处理 返回 值 判断
- C++、Java和C#中的异常处理
- C++异常抛出与捕获及处理
- 对C++中异常处理中的构造和析构的认识
- C/C++学习----第六章 异常处理
- c++异常处理
- 走进C++程序世界------异常处理
- 异常处理与MiniDump详解-(1)C++异常
- 从零开始学C++之异常(一):C语言错误处理方法、C++异常处理方法(throw, try, catch)简介
- C++中异常处理的语法 try catch throw
- [转]C++异常处理 6
- [转]C++异常处理 13
- C++与Java异常处理的区别
- 第三章,c++的异常处理
- C++异常处理:try,catch,throw,finally的用法
- C++ 异常处理
- C++中异常处理的基本思想及throw语句抛出异常的使用