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

考虑性能 返回值 优于 异常

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

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

以下为简单模拟代码:

#include
#include
#include
#include
#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表示程序是否执行错误

你可能感兴趣的:(C++,win32)