Je voudrais utiliser un gestionnaire de msg erreur générique, donc je peux facilement GetLastError
et SetError
facilement pour toute classe. Je suis venu avec ce régime. Mais j'ai quelques questions. Veuillez noter que cette implémentation est juste pour tester. Mais je veux que le design de base soit correct.Comment ajouter un enregistreur d'erreurs à une classe
#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;
}
}
- Puis-je remplacer cette fonction dans une classe d'enfants?
virtual void SetError(const char* zFormat, ...)
. Puis-je supprimer la classeRecordingErrors
? - Je pense que alors
MyClass
devrait hériter deErrorHandler
ce que je ne pense pas est bon. Ai-je raison ou tort? Est-ce une autre question sur la composition sur l'héritage. EDIT: Je ne parle pas du nom, mais de l'idée? - Tous les scénarios possibles cette approche échouerait?
- est-il une meilleure façon de mettre en œuvre la journalisation des erreurs? (L'enregistrement est pas le mot ici. Qu'est-ce)
Avez-vous envisagé d'utiliser des exceptions? –
Nous vous recommandons explicitement de ne pas utiliser d'exceptions. Et aucun du code que j'ai vu dans mon entreprise. De plus, je n'ai pas d'expérience avec les exceptions et je ne suis pas sûr de savoir comment récupérer une exception ou effectuer un nettoyage correctement. – nakiya
[Herb Sutter] (http://herbsutter.com/) a récemment quelques idées pour la journalisation des erreurs: [Effective Concurrency: Savoir quand utiliser un objet actif au lieu d'un Mutex] (http://www.drdobbs.com/ go-parallel/article/showArticle.jhtml? articleID = 227500074 & pgno = 3) – rwong