C语言如何处理异常
#include<assert.h>
处理异常头文件
不同的返回值代表不同的错误但是像1/0这样的操作无法实现报错
double Div(double a,double b)
{
if(a==b)
return -1;
//此语句必须要求a或者b的值不能为‘-1’!!不可能!!
assert(0!=b);
//可以报错,但是只能在debug模式下可以使用,release版本就会被当作空语句
}
c++处理异常
存在问题
double Div(double a,double b)
{
if(0.0==b)
{
throw my_overflow_error("除0");
//throw抛出异常关键字
cout<<"throw"<<endl;//该语句在抛出异常后不执行
}
return a/b;
cout<<"end"<<endl;//此语句不执行
}
解决:设计自己的异常类型
class my_overflow_error
{
private:
const char*m_what;
public:
my_overflow_error() :m_what(nullptr) {}
my_overflow_error(const char *msg) :m_what(msg) {}
my_overflow_error() {m_what=nullptr;}
~my_overflow_error(const my_overflow_error&)=default;
my_overflow_error&operator=(const my_overflow_error&) =default;//C++11
const char* what()cont
{
return m_what ==nullptr ? "unknown exception" :m_what;
}
};
通过关键字抛出异常
double Div(double a,double b)
{
if(0.0==b)
{
//类型不匹配无法处理
throw my_overflow_error("除0");
//throw抛出异常关键字
//my_overflow_error调用拷贝构造函数
//构建一个匿名对象(异常对象)
}
return a/b;
cout<<"end"<<endl;//此语句不执行
}
my_overflow_error(const my_overflow_error&)=default;//该函数为拷贝构造函数
//default表示默认的,默认的拷贝构造是按位构造
#include<vector>
#include<list>
#include<queue>
#include<stack>
#include<excpetion>//异常处理块头文件
ver.size//获取字节大小
int main()
{
double a,y,z;
cin >> x >> y ;
try
{
z=Div(x,y);
cout<<"z:"<<z<<endl;
}
catch(const my_overflow_error &e)//异常对象要和接受类型一致
{
cout<<e.what()<<endl;
}
return 0;
}
如果类型不匹配无法处理,例如
double Div(double a,double b)
{
if(0.0==b)
{
//throw my_overflow_error("除0");
throw string(" 除0...!");
}
return a/b;
}
注:
- 一个异常可被多个catch块接收(参数匹配)
- 有try{} 测试块,catch{}才可被使用处理异常块。
- 函数+const=常方法