一.基本语法
- throw的异常是有类型的,可以是数字、字符串、类对象。
- catch需要严格匹配throw抛出的异常类型。
- 捕获基本异常。
- 捕获所有异常。
案例:除数为0.
//异常基本语法
int divide(int x, int y) {//除法,分母不能为0
if (y == 0) {
throw y;//抛出异常
}
return x / y;
}
void test01() {
//试着捕获异常
try {
divide(10, 0);//分母为0
}
//异常根据类型进行匹配,throw抛出y是int型,所以这里是int型,用exception接收y
catch (int exception) {
cout << "除数为" <<exception<<"!" << endl;
}catch(...){//捕获所有异常
cout << "未知异常!"<< endl;
}
结果:
二.跨函数处理异常
int divide(int x, int y) {//除法,分母不能为0
if (y == 0) {
throw y;//抛出异常
}
return x / y;
}
void CallDivide(int x,int y) {
divide(x, y);
}
void test02() {
try {
CallDivide(10, 0);
}
catch (int e) {
cout << "除数为" << e << endl;
}
}
int main() {
test02();
}
结果:
原理:
三.不处理异常
还是上面例子,不处理异常。
int divide(int x, int y) {//除法,分母不能为0
if (y == 0) {
throw y;//抛出异常
}
return x / y;
}
void CallDivide(int x,int y) {
divide(x, y);
}
void test02() {
CallDivide(10, 0);
}
int main() {
//test01();
test02();
}
结果:程序会挂掉,调用terminate();
四.C++异常特点
1. C++异常可以跨函数处理。
2. C++异常时必须处理。
五.类作为异常抛出
案例1:
class MyException {
public:
void what() {
cout << "未知异常!" << endl;
}
};
void func03() {
throw MyException();//调用了构造方法,抛出MyException匿名对象
}
int main() {
try {
func03();
}
catch (MyException e) {//e接受了这个匿名对象
e.what();//可以调用类方法
}
}
结果:
案例2:
class MyException {
public:
MyException(string str) {
error = str;
}
~MyException() {
cout << "~MyException()" << endl;
}
void what() {
cout << error << endl;
}
private:
string error;
};
void func03() {
throw MyException("C++折磨人啊!");//抛出MyException匿名对象
}
int main() {
try {
func03();
}
catch (MyException e) {//e接受了这个匿名对象
e.what();//可以调用类方法
}
}
结果: