异常

  程序有时会遇到运行阶段错误,导致程序无法正常的运行下去,这就是异常。异常是相对较新的C++功能,有些老式编译器可能没有实现,另外,有些编译器默认关闭这种特性,需要使用编译器选项来启用它。

异常机制
对异常的处理有3个组成部分:
1.引发异常;
2.使用处理程序捕获异常;
3.使用try块;

int main()
{
    double x, y, z;

    std::cout << "Enter two numbers: ";
    while (std::cin >> x >> y)
    {
        try
        {
            z = hmean(x, y);
        }
        catch (const char * s)
        {
            std::cout << s << std::endl;
            std::cout << "Enter a new pair of numbers: ";
            continue;
        }
        std::cout << "Harmonic mean of " << x << "and" << y
            << "is" << z << std::endl;
        std::cout << "Enter next set of numbers <q to quit>: ";
    }
    std::cout << "Bye!\n";

    return 0;
}

double hmean(double a, double b)
{
    if (a == -b)
        throw "bad hmean() arguments: a = -b not allowed";//引发异常,跳转
    return 2.0 * a * b / (a + b);
}

输入9和-9传递给hmean()函数后将引发异常,这将终止hmean()的执行。程序向后搜索发现,hmean()函数是从main()中的try块中调用的,因此程序查找与异常类型匹配的catch块。程序中唯一的一个catch块的参数为char *,因此它与引发异常匹配。程序将字符串“bad hmean() arguments: a = -b not allowed”赋给变量s,然后执行处理程序中的代码。
  程序出现问题时将引发异常。throw语句实际上是跳转,即命令程序跳到另一条语句。throw关键字表示引发异常,紧随其后的值(例如字符串或对象)指出了异常的特征。
  程序使用异常处理程序来捕获异常,异常处理程序位于要处理问题的程序中。catch关键字表示捕获异常。处理程序以关键字catch开头,随后是位于括号中的类型声明,它指出异常处理程序要响应的异常类型,然后是一个用花括号括起来的代码块,指出要采取的措施。catch关键字和异常类型用作标签,指出当异常被引发时,程序应跳到这个位置执行。异常处理程序也被称为catch块。
  try块标识其中特定的异常可能被激活的代码块,它后面跟一个或多个catch块。关键字try后面是一个由花括号括起来的代码块,表明需要注意这些代码引发的异常。

上面代码中引发异常的是字符串"bad hmean() arguments: a = -b not allowed"。异常类型可以是字符串或其它C++类型;通常为类类型。
执行throw语句类似于执行返回语句,因为它也将终止函数的执行;但throw不是将控制权返回给调用程序,而是导致程序沿函数调用序列后退,直到找到包含try块的函数。
如果函数引发了异常,而没有try块或没有匹配的处理程序时,默认情况下程序将调用abort()函数。

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

class logic_error : public exception {
public:
	explicit logic_error(const string what_arg)
	...
};

class domain_error : public logic_error{
public:
	explicit logic_error(const string what_arg)
	...
};

这两个新类被用作两个派生类系列的基类。异常类系列logic_error描述了典型的逻辑错误。有关的派生类:
• domain_error;//定义域错误
• invalid_argument;//无效参数
• length_error;//没有足够的空间来执行所需的操作
• out_of_bounds;//只是索引错误

runtime_error异常系列描述了可能在运行期间发生但难以预计和防范的错误。有关派生类:
• range_error;
• overflow_error;
• underflow_error;
一般而言,logic_error系列异常表明存在可以通过编程修复的问题,而runtime_error系列异常表明存在无法避免的问题。

bad_alloc异常
对于使用new导致的内存分配问题,C++的最新处理方式是让new引发bad_alloc异常。头文件new包含了bad_alloc类的声明,它也是从exception类的公有派生而来。

总之,虽然异常处理对于某些项目极为重要,但它也会增加编程的工作量、增大程序、降低程序的速度。另一方面,不进行错误检查的代价可能非常高。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值