如何让一个C++函数不抛出异常

本文探讨了不同方式下C++异常处理的方法,包括如何在一个函数内管理多个可能抛出异常的子函数,以及如何精简代码结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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…写在函数外,却对整个函数有作用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值