C语言处理异常有assert和返回错误码两种方式,C++新添加了异常的属性。
异常通过对象抛出,抛出异常没捕获就会报错
double Division(int a, int b)
{
if (b == 0)
//抛出异常
throw"Division by zero condition!";
else
return ((double)a) / ((double) b);
}
void Func()
{
int len, time;
cin >> len >> time;
cout << Division(len, time) << endl;
}
int main()
{
try {
Func();
}
// catch会捕获所有func()调用栈帧的异常
catch (const char* errmsg)
{
cout << errmsg << endl;
}
return 0;
}
注意捕获异常的参数和抛出的异常相同,如果不同就不会捕获。
int main()
{
try {
Func();
}
// catch会捕获所有func()调用栈帧的异常
catch (int errmsg)
{
cout << errmsg << endl;
}
return 0;
} //不会打印信息,参数类型不同,捕获不到异常
多个catch语句可以捕获多个异常
try {
Func();
}
// catch会捕获所有func()调用栈帧的异常
catch (int errmsg)
{
cout << errmsg << endl;
}
catch (const char* errmsg)
{
cout << errmsg << endl;
}
抛出的异常会通过栈帧层层返回,直到被捕获,如果没有被捕获,就会终止程序
void Func()
{
try {
int len, time;
cin >> len >> time;
cout << Division(len, time) << endl;
}
catch (const char* msg)
{
cout << msg << endl;
cout << "fun捕获";
}
}//异常在fun中被捕获了。不会被main()捕获
异常捕获后,Fun()的catch后的代码继续执行。
try{}
catch(...)
{}
catch(...)可以捕获所有异常
一般服务器开发的异常通常使用异常继承体系,异常是一个自定义结构体,包含错误id和错误信息。抛出的对象是对象的拷贝,可能是一个临时对象
class Exception
{
public:
Exception(const string& errmsg, int id)
:_errmsg(errmsg)
, _id(id)
{}
virtual string what()const
{
return _errmsg;
}
protected:
string _errmsg;
int _id;
};
C++中抛派生类异常用基类捕获。
catch内部可以在捕获异常,再抛出
try{}
catch(...)
{
throw;
}