您的位置:首页 > 编程语言 > C语言/C++

[学习笔记]C++中的异常机制

2014-07-16 16:00 225 查看
博主上周末去参加了华为机试,本来信心满满,自认为至少能做对一道题,所以并没有充分准备,导致悲剧发生,从而尝到了轻敌、自大的后果。虽说博主的第一选择并非华为,但作为应届生能去华为这种大公司面试面试,见见世面,也是极好的。事已至此,木已成舟,抱怨已经没有意义,唯有认识到自己的缺点,更加去努力改正才能进步。人生不就是不断让自己进步的过程嘛~

废话不多说了,希望大家能吸取博主的教训。

最近复习了C++中的异常机制,它是C语言中没有的功能;了解了C++的异常机制,那么Java和Objective-C中的异常机制就很好理解了,因为他们如出一辙。

程序有时会遇到运行阶段错误,导致程序无法正常的运行下去,C++的异常机制就是为处理这种情况而存在的。
C++异常是对程序运行过程中发生的异常情况(如被0除)的一种响应。C++中对异常处理有3个组成部分:引发异常(throw);使用处理程序捕获异常(catch);使用try块(try)。在Java和Objective-C中还多一个部分:finally。
throw关键字表示引发异常,紧随其后的值指出异常特征;实际上它是跳转语句,即命令程序跳到另一条语句。catch关键字表示捕获异常,位于其括号中的是类型声明,指出了异常处理程序要响应得类型;随后的花括号括起的代码块指出要采取的措施。try块表示其中特定的异常可能被激活的代码块,它后面跟一个或多个catch块。
如try块可以这样写:

try {
z = hmean(x,y)      //hmean求两个数的调和平均数,表达式:2.0乘x乘y/(x + y),所以x不能等于-y
}


引发异常的代码可与下面类似:

if (a == -b)
throw “bad hmean() arguments: a = -b not allowed”;


异常类型可以是字符串或是其他C++类型,而通常使用类类型。
执行throw类似与执行return语句,因为它也将终止函数执行,但throw不是将控制权返回给调用程序,而是沿函数调用序列后退,直到找到包含try块的函数。
catch块与下面类似:

catch (char * s)
{
cout << s << endl;
cout << “enter a new pair of nums:”
}


当异常与该处理程序(catch块)括号中的类型匹配时,程序将执行花括号中的代码。
异常通常使用的是类类型,你可以自己编写一个类,也可以使用exception类,exception头文件定义了exception类,C++可以把它用作其他异常类的基类。有个名为what()的虚拟成员函数,它返回一个字符串,该字符串的特征随实现而异。由于其是个虚方法,由此可以在从exception派生而来的类中重新定义它:

#include <exception>
class bad_mean : public std::exception
{
public:
const char * what() {  return “bad argument to mean()”;}
…
};


如果不想以不同的方式处理这些派生而来的异常,可以在同一个基类处理程序中捕获它们:

try{
…
}
catch(std::exception &e)
{
cout << e.what() << endl;
…
}


头文件std except定义了其他几个异常类。首先定义了logic_error和runtime_error类,它们都是以公有方式从exception派生而来

class logic_error : public exception{
public:
expect logic_error(const string& what_arg);
…
};


这些类的构造函数接受一个string对象作为参数,该参数提供了方法what()以C风格字符串方式返回的字符数据。
这两个新类被用作两个派生类系列的基类。
异常类系列logic_error描述了典型的逻辑错误。总体而言,通过合理的编程可以避免这种错误,但实际上这些错误还是可能发生的。每个类名指出了它用于报告的错误类型,如:domain_error,invalid_argument,length_error,out_of_bounds等。
runtime_error系列异常描述了可能在运行期间发生但难以预计和防范的错误。同样每个类名指出了它用于报告的错误类型:range_error,overflow_error,underflow_error等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: