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;