abort()函数

位于头文件cstdlib中,向标准错误输出流(cerr)发送程序异常终止消息,然后终止程序。并返回一个值,通知处理失败

此处用a+b可能导致分母为0作为例子

#include <iostream>
#include <cstdlib>
using namespace std;
template<class T>
T hmean(T a,T b);
int main()
{
        double x,y,z;
        while(cin>>x>>y)
        {
                z=hmean(x,y);
                cout<<x<<","<<y<<","<<z<<endl;
        }

}
template<class T>
T hmean(T a,T b)
{
        if(a==-b)
        {
                abort();
        }
        return 2.0*a*b/(a+b);
}

异常机制:

c++异常是对程序运行过程中发生的异常情况的一种响应,将控制器从程序的一部分转移到另外一部分。

对异常的处理由3个部分组成:

1   引发异常

2   使用处理程序捕获异常

3   使用try块

 

throw关键字表示引发异常,随着其后的值指出异常的特征

catch关键字表示捕获异常,随后是位于括号的类型声明,指出了异常处理程序要响应的异常类型

try标识其中特定的异常可能被激活的地方

例子:

#include <iostream>
using namespace std;
double hmean(double a,double b);

int main()
{
        double x,y,z;
        while(cin>>x>>y)
        {
                try
                {       
                   z = hmean(x,y);
                }  
                catch(const char* s)
                {
                   cout<<s<<endl;
                   continue;
                }
                cout<<x<<","<<y<<","<<z<<endl;
        }
        return 0;
}

double hmean(double a,double b)
{
        if(a==-b)
                throw "a==-b not allowed";
        return 2.0*a*b/(a+b);
}

在try的代码块内的某条语句导致异常被引发,则后面的catch代码块将对异常进行处理,且异常类型可以为任意类。

throw语句类似于执行返回语句,其也将终止函数的执行,导致程序沿着函数调用序列后退,知道找到包含try块的函数

若执行try块时没有发生异常则直接跳过catch块,执行后面的函数

 

将对象用作异常类型

#include <iostream>
#include <cmath>
using namespace std;
class Bad_hmean
{
        private:
                int v1;
                int v2;
        public:
                Bad_hmean(int a ,int b):v1(a),v2(b){}
                inline void messg()
                {
                cout<<"invalid argument : a = -b"<<endl;
                }
};


int hmean(int a,int b);
int main()
{
        int x,y,z;
        while(cin>>x>>y)
        {
                try
                {
                   z=hmean(x,y);
                }   
                catch(Bad_hmean& bh)
                {
                        bh.messg();
                        continue;
                }
        }
        return 0;
}

int hmean(int a,int b)
{
        if(a==-b)
                throw Bad_hmean(a,b);
        return 2*a*b/(a+b);
}

在C++11中可以用关键字noexcept指出函数不会发出异常

例如:  double NOO() noexcept;

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐