1. C++异常处理
-
C++内置了异常处理的语法元素
try...catch...
(1)try
语句处理正常代码逻辑
(2)catch
语句处理异常情况
(3)try
语句中的异常有对应的catch
语句处理
-
C++通过
throw
语句抛出异常信息
-
C++异常处理分析
throw
抛出的异常必须被catch
处理
(1) 当前函数能够处理异常,程序继续往下执行
(2) 当前函数无法处理异常,则函数停止执行,并返回
(3) 未被处理的异常会顺着函数调用栈向上传播,直到被处理为止,否则程序将停止执行。
编程说明:C++异常处理初探
#include <iostream>
#include <string>
using namespace std;
double divide(double a, double b)
{
const double delta = 0.00000000000001;
double ret = 0;
if ( !((-delta < b) && (b < delta)) )
{
ret = a / b;
}
else
{
throw 0;
}
return ret;
}
int main()
{
try
{
double r = divide(1, 0);
cout << r << endl;
}
catch(...)
{
cout << "Divided by zero ... " << endl;
}
return 0;
}
输出结果:
Divided by zero ...
2. 深入理解try...catch...
- 同一个
try
语句可以跟上多个catch
语句 -
catch
语句可以定义具体处理的异常类型 -
不同类型的异常由不同的
catch
语句负责处理 -
try
语句中可以抛出任何类型的异常 -
catch(...)
用于处理所有类型的异常 - 任何异常都只能被捕获(catch)一次
3. 异常处理的匹配规则
- 异常抛出后,至上而下严格匹配每一个catch语句处理的类型。异常处理匹配时,不进行任何的类型转换。
编程说明:异常类型匹配
#include <iostream>
#include <string>
using namespace std;
void Demo1()
{
try
{
throw 1;
}
catch(char c)
{
cout << "catch(char c)" << endl;
}
catch(short s)
{
cout << "catch(short s)" << endl;
}
catch(double d)
{
cout << "catch(double d)" << endl;
}
catch(int i)
{
cout << "catch(int i)" << endl;
}
catch(...)
{
cout << "catch(...)" << endl;
}
}
void Demo2()
{
throw "abcd";
}
int main()
{
Demo1();
try
{
Demo2();
}
catch(const char* s)
{
cout << "catch(const char* s)" << endl;
}
catch(string ss)
{
cout << "catch(string ss)" << endl;
}
return 0;
}
输出结果
catch(int i)
catch(const char* s)
4. 小结
- C++中直接支持异常处理的概念
-
try...catch...
是C++中异常处理的专用语句 -
try
语句处理正常代码逻辑,catch
语句处理异常情况 - 同一个
try
语句可以跟上多个catch
语句 - 异常处理必须严格匹配,不进行任何的类型转换