對於獨立的功能,或靜態類的方法,可以使用靜態本地變量:
void function()
{
static int num_called = 0;
if(++num_called > 1)
{
// do something to handle the error
}
...
}
對於非靜態類的方法,使用一個類數據成員爲每個方法,允許類的各個實例做自己的跟蹤:
class AClass
{
private:
int num_method1_called;
int num_method2_called;
public:
AClass();
void method1();
void method2();
...
};
AClass::AClass() :
num_method1_called(0),
num_method2_called(0)
{
}
void AClass::method1()
{
if(++num_method1_called > 1)
{
// do something to handle the error
}
...
}
void AClass::method2()
{
if(++num_method2_called > 1)
{
// do something to handle the error
}
...
}
如果錯誤處理始終是相同的,認爲它解壓到一個可重複使用的幫手:
struct callTracker
{
int counter;
callTracker() : counter(0) {}
void called()
{
if(++counter > 1)
{
// do something to handle the error
}
}
};
void function()
{
static callTracker tracker;
tracker.called();
...
}
或者:
struct singleCallTracker
{
int counter;
singleCallTracker() : counter(0) {}
void called()
{
if(++counter > 1)
{
// do something to handle the error
}
}
};
struct multiCallTracker
{
std::map<std::string, singleCallTracker> trackers;
void called(const std::string &name)
{
trackers[name].called();
}
};
void function()
{
static singleCallTracker tracker;
tracker.called();
...
}
class AClass
{
private:
multiCallTracker method_tracker;
public:
void method1();
void method2();
...
};
void AClass::method1()
{
method_tracker.called(__FUNC__);
...
}
void AClass::method2()
{
method_tracker.called(__FUNC__);
...
}
這是旨在用於調試的目的? – VTT
@VTT不嚴格。 – nyarlathotep108
如果這是爲了在生產中使用,那麼您可能需要爲監控軟件編寫某種通知,例如'zabbix'或'collectd'計數器。請注意,此方法將確切的錯誤處理委託給負責產品支持的人員。如果這是應該在應用程序中處理的錯誤,那麼您可能想要拋出異常並編寫錯誤處理程序代碼(可能仍會通知外部監視軟件)。 – VTT