何時用返回值何時用異常來用於錯誤處理

考慮性能 返回值 優於 異常

如果程序中高頻出現錯誤處理,則用返回值

情景:假如不考慮用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表示程序是否執行錯誤
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章