【发布时间】:2010-10-14 05:21:44
【问题描述】:
我想使用一个通用的错误消息处理程序,这样我就可以轻松地为任何类使用GetLastError 和SetError。我想出了这个方案。但我有几个问题。请注意,此实现仅用于测试。但我想把基本设计做好。
#include <iostream>
#include <stdarg.h>
class ErrorHandler
{
public:
virtual void SetError(const char* zFormat, ...)
{
va_list args;
va_start (args, zFormat);
vsnprintf (z_ErrorBuf, sz_MaxBufSize, zFormat, args);
va_end (args);
}
const char* GetError() const
{
return z_ErrorBuf;
}
virtual ~ErrorHandler(){}
explicit ErrorHandler(const size_t szMaxBufSize = 1024)
{
z_ErrorBuf = malloc(sizeof(char)*szMaxBufSize);
sz_MaxBufSize = szMaxBufSize;
}
void ResizeBuffer(const size_t szMaxBufSize)
{
z_ErrorBuf = realloc(z_ErrorBuf, szMaxBufSize);
sz_MaxBufSize = szMaxBufSize;
}
protected:
char* z_ErrorBuf;
size_t sz_MaxBufSize;
};
class MyClass;
//Worker can be just an interface if needed. So, can't use friend.
class Worker
{
public:
void Work(MyClass& oGod);
};
void Worker::Work(MyClass& oGod)
{
//Work
//OnError
oGod.GetErrorHandler().SetError("Save me %s", "not");
}
class RecordingErrors
{
public:
const char* GetLastError() const
{
return oErrorHandler.GetError();
}
//GetErrorHandler is public
ErrorHandler& GetErrorHandler()
{
return oErrorHandler;
}
private:
ErrorHandler oErrorHandler;
};
class MyClass : public RecordingErrors
{
public:
bool GetThingsDone(Worker& me)
{
me.Work(*this);
//on Error
return false;
}
};
int main()
{
MyClass oL;
Worker w;
if(!oL.GetThingsDone(w))
{
std::cout << oL.GetLastError() << std::endl;
}
}
- 我可以在子类中覆盖这个函数吗?
virtual void SetError(const char* zFormat, ...)。 - 我可以取消
RecordingErrors类吗?我觉得MyClass必须从ErrorHandler继承,我认为这不好。我是对还是错?这是关于组合而不是继承的另一个问题。编辑:我指的不是名字,而是想法? - 这种方法会失败的任何可能情况?
- 有没有更好的方法来实现错误日志记录?(这里的日志记录不是正确的词。它是什么)
【问题讨论】:
-
你考虑过使用异常吗?
-
我们被明确建议不要使用异常。而且我在公司看到的所有代码都没有。此外,我没有处理异常的经验,我不确定如何从异常中恢复或正确执行清理。