何时用返回值何时用异常来用于错误处理

5 篇文章 0 订阅

考虑性能 返回值 优于 异常

如果程序中高频出现错误处理,则用返回值

情景:假如不考虑用select和epoll等,用轮询来读取多个连接的数据,此时为了不互相阻塞干扰,用非阻塞的读取函数。此时read将大量出现返回-1的情况,如果不用返回值表示暂时无数据读取,而用异常。那么性能消耗将是可怕的。

以下为简单模拟代码:

#include<iostream>
#include<Windows.h>
#include<ctime>
#include<list>
#define ERROR_XXXX_XXXX  ((HRESULT)0xE1000008L)//暂时无网络数据
using namespace std;

/*
何时用错误何时用异常 by https://blog.csdn.net/qq_26046771/article/details/106894723
*/

/*从接收缓冲区复制数据到_outbuff  
myread和myread1都为非阻塞版本
*/

int randnum = 0;;//模拟无数据时概率
list<int> randnumlist;//保证myread和myread1测试的随机数一样
int myread(char* _outbuff,int len) {
	/*......省略........*/
	
	/*以下仅模拟失败概率*/
	if (randnum % 5 == 0)
	{
		return -1;
		SetLastError(ERROR_XXXX_XXXX);
	}
	else
	{
		memcpy_s(_outbuff, len, "hello kity", 11);
		return 11;
	}
}

int myread1(char* _outbuff, int len) {
	/*......省略........*/
		/*以下仅模拟失败概率*/
	if (randnum % 5 == 0)
		throw "暂时无数据可供读取";
	memcpy_s(_outbuff, len, "hello kity", 11);
	return 11;
}

void test() {
	char buff[1000];
	srand(time(NULL));
	for (int i = 0; i < 1000000; ++i) {
		randnumlist.push_back(rand());
	}

	auto starttime = time(0);
	for (const auto&tmp:randnumlist) {
		randnum = tmp;
		if (myread(buff, 1000) != -1)
			cout << buff <<endl;
		else {
			if (GetLastError() == ERROR_XXXX_XXXX)
				;//错误处理
		}
	}
	cout << "耗时:" << time(0) - starttime << endl;
	getchar();
	starttime = time(0);
	for (const auto &tmp : randnumlist) {
		randnum = tmp;
		try {
			myread1(buff,1000);
			cout << buff<<endl;
		}
		catch (const char* str) {
			;//错误处理
		}
	}
	cout << "耗时:" << time(0) - starttime << endl;
}
int main() {
	test();
	return 0;
}

程序执行结果
前者:耗时:39
后者耗时:151

低频错误处理用异常---------返回值的错误可能人为马虎漏掉处理,但是异常你不处理程序就会停掉,逼着你处理程序执行错误,防止出现与预期不同的执行结果。同时用异常比返回值写起来舒服多了。

比如用户输入参数错误,谁无事光输入错误参数。

ULONGLONG getfilelength(const string &filename);//此函数就可以用抛出异常来表示查看的文件不存在
//.............
cout<<"请输入要查看的文件"<<endl;
cin>>filename;
cout<<"你要查看的文件大小:"<<getfilelength(filename)<<endl;

题外话: 无特殊返回值表示错误值咋办?

比如下面

bool Peer::getstate();

你可以这样

bool Peer::getstate(int *_outres);//用_outres表示程序是否执行错误
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值