1. 尝试一
如果一个fun()调用funA(),funA()可能会抛出异常,那么想让fun()不抛出异常,fun()就得catch
funA()的所有异常,并且不要继续往上throw
。
#include <iostream>
using namespace std;
int funA(int a) {
std::cout << "funA : " << a << std::endl;
throw 1;
//return a;
}
int fun(int b) {
std::cout << "fun : " << b << std::endl;
try {
funA(b);
} catch (...) {
std::cout << "catched funA exception" << std::endl;
}
return b;
}
int main(int argc, char *argv[]) {
int ret = fun(60);
std::cout << "main : " << ret << std::endl;
return 0;
}
输出:
fun : 60
funA : 60
catched funA exception
main : 60
很简单,fun中catch了funA的异常,打印出了日志。
2. 尝试二
上面fun函数中只调用了一个可能抛出异常的函数funA,要是要调用多个怎么办,最先想到的,应该是这样的。
#include <iostream>
using namespace std;
int funA(int a) {
std::cout << "funA : " << a << std::endl;
throw 1;
//return a;
}
int funB(int a) {
std::cout << "funB : " << a << std::endl;
throw 1;
//return a;
}
int funC(int a) {
std::cout << "funC : " << a << std::endl;
throw 1;
//return a;
}
int fun(int b) {
std::cout << "fun : " << b << std::endl;
try {
funA(b);
} catch (...) {
std::cout << "catched funA exception" << std::endl;
}
try {
funB(b);
} catch (...) {
std::cout << "catched funB exception" << std::endl;
}
try {
funC(b);
} catch (...) {
std::cout << "catched funC exception" << std::endl;
}
return b;
}
int main(int argc, char *argv[]) {
int ret = fun(60);
std::cout << "main : " << ret << std::endl;
return 0;
}
输出:fun : 60
funA : 60
catched funA exception
funB : 60
catched funB exception
funC : 60
catched funC exception
main : 60
fun中catch了funA、funB和funC的异常,打印出了日志。但是代码量是不是多了,而且,那么多try…catch…,是不是有些喧宾夺主了?
3. 尝试三
用一个try…catch…区解决fun中的所有异常行不行,当然可以。
#include <iostream>
using namespace std;
int funA(int a) {
std::cout << "funA : " << a << std::endl;
throw 1;
//return a;
}
int funB(int a) {
std::cout << "funB : " << a << std::endl;
throw 1;
//return a;
}
int funC(int a) {
std::cout << "funC : " << a << std::endl;
throw 1;
//return a;
}
int fun(int b) {
std::cout << "fun : " << b << std::endl;
try {
funA(b);
funB(b);
funC(b);
} catch (...) {
std::cout << "catched exception" << std::endl;
}
return b;
}
int main(int argc, char *argv[]) {
int ret = fun(60);
std::cout << "main : " << ret << std::endl;
return 0;
}
输出:
fun : 60
funA : 60
catched exception
main : 60
3个可能抛出异常的函数被一个try…catch…管理了,看着比上一个清晰了,但是一个try…catch…中处理多个业务,会导致try…catch…中代码特别长
4. 最终
#include <iostream>
using namespace std;
int funA(int a) {
std::cout << "funA : " << a << std::endl;
throw 1;
//return a;
}
int funB(int a) {
std::cout << "funB : " << a << std::endl;
throw 1;
//return a;
}
int funC(int a) {
std::cout << "funC : " << a << std::endl;
throw 1;
//return a;
}
int fun(int b) try {
std::cout << "fun : " << b << std::endl;
funA(b);
funB(b);
funC(b);
return b;
} catch (...) {
std::cout << "catched exception" << std::endl;
return b;
}
int main(int argc, char *argv[]) {
int ret = fun(60);
std::cout << "main : " << ret << std::endl;
return 0;
}
输出:
fun : 60
funA : 60
catched exception
main : 60
try…catch…写在函数外,却对整个函数有作用!