一 、c++的异常处理
1、c++内置了异常处理语法元素try...catch
(1)、try语句处理正常逻辑代码
(2)、catch处理异常情况
(3)、try语句中的异常由对应的catch语句处理
2、c++通过throw语句抛出异常信息
3、c++异常处理分析
(1)、throw抛出的异常必须被catch处理(否则有异常时运行发生错误)
A、当前函数能处理异常,程序继续往下执行
B、当前函数无法处理异常,则函数停止执行,并返回
C、未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行
#include <iostream>
using namespace std;
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异常时,抛出整数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、同一个try语句可以跟上多个catch语句
(1)、catch语句可以定义具体处理的异常类型
(2)、不同类型的异常由不同的catch语句负责处理
(3)、try语句可以抛出任何类型的异常
(4)、catch(...)用于处理所有类型的异常(多个catch语句时,catch(...)要放在最后)
(5)、任何类型的异常都只能被捕获(catch)一次
5、异常处理的规则
(1)、异常抛出后,自上而下严格匹配每一个catch语句处理类型
(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):" << 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 "SantaClaus"; //const char*类型
//throw string("SantaClaus"); //string类型
}
int main()
{
Demo1();
try
{
Demo2();
}
catch(char* s)
{
cout << "catch(char* s):" << s << endl;
}
catch(const char* s)
{
cout << "catch(const char* s):" << s << endl;
}
catch(string s)
{
cout << "catch(string s):" << s << endl;
}
return 0;
}
/*输出结果:
catch(int c):1
catch(const char* s):SantaClaus
*/
二、小结
(1)、c++直接支持异常处理的概念
(2)、try...catch...是c++中异常处理的专用语句
(3)、try语句处理正常逻辑的代码,catch处理异常情况
(4)、同一个try语句可以跟上多个catch语句
(5)、异常处理必须严格匹配,不进行任何类型的转换
原文链接: https://www.cnblogs.com/gui-lin/p/6381604.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/249031
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!