关于异常

来源:互联网 发布:云计算的好处 编辑:程序博客网 时间:2024/05/20 19:31

程序的一般消亡形式:无疾而终,自杀,他杀。
C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。

  关于语法错误,不必多说,写代码时心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误。

  第二种是运行时的错误,常见的有文件打开失败、数组下标溢出、系统内存不足等等。而一旦出现这些问题,引发算法失效、程序运行时无故停止等故障也是常有的。这就要求我们在设计软件算法时要全面。比如针对文件打开失败的情况,保护的方法有很多种,最简单的就是使用“return”命令,告诉上层调用者函数执行失败;另外一种处理策略就是利用c++的异常机制,抛出异常
  
C++异常处理机制是一个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的弹性、安全性和稳固性,克服了传统方法所带来的问题.

异常的抛出和处理主要使用了以下三个关键字: try、 throw 、 catch 。抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:throw 表达式;

try ,catch格式如下:

 try  {       可能出现错误的语句块;  }  catch (类型名[形参名]{  }

C++异常机制

异常提供了将控制权从程序的一部分传递到另一部分的途径
对异常处理有3个组成部分

引发异常
使用处理程序捕获异常
使用try块
throw语句类似跳转,throw关键字引发异常,并且其随后的值指出了异常的特征

处理异常用catch捕获

执行throw语句类似执行返回语句,因为它也将终止函数的执行;但是throw不是将控制权返回给调用程序,而是导致程序沿着函数调用序列后退,,直到找到包含try块的函数

如果函数引发异常,而没有try块或没有匹配的处理函数,程序最终降调用abort()函数。

简单理解异常

#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>#include<stdlib.h>using namespace std;double fuc(double i, double j){    if (j == 0)    {        throw(j);//除数为零,抛出异常。    }    return i / j;//无异常,正常返回。}int main(){    try    {        double res;        res = fuc(4, 2);        cout << "res=" << res;        cout << endl;        double resu = fuc(2, 0);        cout << resu;    }    catch (double)//捕捉异常;      {        cout << "除数为零";    }    cout << endl;    system("pause");    return 0;}

使用异常类

class MyException {public:    void pf(){        cout << "error" << endl;    };}; class Test { public:   Test(int a = 0, int b = 0)   {     this->a = a;     this->b = b;     cout << "Test 构造函数执行" << "a:" << a << " b: " << b << endl;   }   void printT()   {     cout << "a:" << a << " b: " << b << endl;   }   ~Test()   {     cout << "Test 析构函数执行" << "a:" << a << " b: " << b << endl;   } private:   int a;   int b; }; void myFunc() // throw (MyException) {   Test t1(1,1); //  Test t2(2,2); //   cout << "定义了两个栈变量,异常抛出后测试栈变量的如何被析构" << endl;   throw MyException(); } int main() {     //异常被抛出后,从进入try块起,到异常被抛掷前,这期间在栈上的构造的所有对象,     //都会被自动析构。析构的顺序与构造的顺序相反。     //这一过程称为栈的解旋(unwinding)     try    {         myFunc();     }     catch(MyException &e)     //catch (MyException)    {        e.pf();        //这里不能访问异常对象         cout << "接收到MyException类型异常" << endl;     }     catch (...)     {         cout << "未知类型异常" << endl;     }    return 0;}

参考:
C/C++异常处理
http://blog.sina.com.cn/s/blog_8efe12c9010118xp.html

0 0
原创粉丝点击