1、 C++内置的异常处理:try-catch
1.1、
try
语句处理
正常代码逻辑
1.2、
catch
语句
处理异常情况
1.3、
try语句中的异常由对应的catch语句处理,如果对应的catch中
没有处理该异常
,会自动继续
沿函数调用栈向上被抛出
。
2、C++通过throw语句抛出异常情况
double divide(double a, double b)
{
const double delta = 0.000000000000001;
double ret = 0;
if( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw 0; //产生除0异常 }
return ret;
}
3、C++异常处理分析
3.1、
throw抛出的异常必须被catch处理
3.1.1、
当前函数
能够处理异常
,程序
继续往下执行
3.1.2、
当前函数
无法处理异常
,则
函数停止执行,并返回
3.2、
异常处理的流程:
未被处理的异常会顺着函数调用栈向上传播
,直到被处理为止,否则程序将停止执行。(PS:如果main函数中都没有处理throw的异常,程序停止)
#include <iostream>
using namespace std;
double divide(double a, double b)
{
const double delta = 0.0000000000001;
double ret = 0;
if( !((-delta < b) && (b < delta)) )
{
ret = a/b;
}
else
{
throw 0; //除0异常时,抛出整数0.,因异常不在该函数处理,会向外层调用函数传递。
}
return ret;
}
int main()
{
try
{
//除0时由于divide函数抛出异常,而在函数内部那里又没有处理该异常,因此异常被继续抛出,到了main函数中调用函数的代码之处,而在这里异常被try-catch捕获会转向catch语句中,catch处理完后,会直接转向catch语句的后面"return 0;"去执行。而不是转到调用函数的下一行语句(即cout << "r = " << r << endl;)
double r = divide(1, 0);
cout << "r = " << r << endl;
}
catch(...)
{
cout << "Divide by zero....." << endl;
}
return 0;
}
4、多个catch块
4.1、
catch语句
可以定义捕获具体类型的异常
(如处理int型、double型、自定义类型的异常等)
4.2、
不同类型的异常由不同的catch语句负责处理
4.3、
throw可以
抛出任何类型的异常
4.4、
catch(…)用于处理
所有类型的异常
,
必须放在所有的catch块之后
。
4.5、
任何异常都
只能被捕获(catch)一次
。
5、异常处理的匹配规则
5.1、
异常抛出后,
至上而下
严格匹配
每一个catch语句处理的类型。
5.2、
异常处理匹配时,
不进行任何的类型转换
。
/**************** 异常类型匹配 **********/
#include <iostream>
#include <string>
using namespace std;
void Demo1()
{
try
{
throw 1;//1默认为整型,将从上至下严格匹配各catch,即catch(int c)
//如果throw 'c',将匹配catch(char c),注意不进行任何的类型转换!
}
catch(char c)
{
cout << "catch(char c):" << endl;
}
catch(short c)
{
cout << "catch(short c):" << c << endl;
}
catch(double c)
{
cout << "catch(double c):" << c << endl;
}
catch(int c)
{
cout << "catch(int c):" << c << endl;
}
catch(...) //所有异常,必须放在所有的catch之后,因为是自上而下匹配的
{
cout << "catch(...)" << endl;
}
}
void Demo2()
{
throw string("DT.SoftWare!!");
//throw "DT.SoftWare!!"; //const char *类型, 绝对的匹配,不允许任何的类型转换
}
int main()
{
//Demo1();
try
{
Demo2();
}
catch(char* s)
{
cout << "catch(char* s):" << endl;
}
catch(const char* cs)
{
cout << "catch(const char* cs):" << endl;
}
catch(string ss)
{
cout << "catch(string ss):" << endl;
}
return 0;
}
6、小结
6.1、
C++中直接支持异常处理的概念
6.2、
try…catch是C++中异常处理的专用语句
6.3、
try语句
处理
正常代码逻辑
,
catch语句
处理异常情况
。
6.4、
同一个try语句可以跟上多个catch语句(直到遇上匹配的那个)
6.5、
异常处理必须
严格匹配
,
不进行任何的类型转换
。