考慮性能 返回值 優於 異常
如果程序中高頻出現錯誤處理,則用返回值
情景:假如不考慮用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表示程序是否執行錯誤