2010-10-15 64 views
1

我写了这个接口:这个方案有错误记录有什么问题吗?

//The idea is to use EHPrint to construct the error msg and then raise an error or 
//a warning, etc. This removes the need to implement all 3 'Raise' functions 
//as taking variable param list reducing code.             
class ErrorHandler                
{ 
    public: 
     virtual void RaiseError(bool, int) = 0;      
     virtual void RaiseWarning(int) = 0;         
     virtual void RaiseMsg() = 0;           

     __attribute__((format(printf, 1, 2))) 
     virtual const char* EHPrint(const char*, ...) = 0;      

     virtual ~ErrorHandler(){}            
}; 

忘记多线程问题,因为一个对象将只在一个线程中使用。实现类可以记录日志,向用户提出错误或根据需要终止。缺点是你必须先打电话给EHPrint,然后才能提出错误等等。我可以通过任何方式使这更美丽?

编辑: 当我想要RaiseError时,我真的想调用一个函数。截至目前,我必须致电EHPrintf,然后致电RaiseError

EDIT2: 我认为这是我的错误,我把错误处理和错误记录结合在一起。将尝试和分开他们,看看。

EDIT3: 我想我现在应该发布记录:

class Logger               
{ 
    public: 
     enum LogType             
     { 
      LT_DEBUG = 0,           
      LT_WARNING,            
      LT_ERROR,            
      LT_STAT,             
      LT_TEXT             
     };               

     __attribute__((format(printf, 5, 6)))      
     virtual const char* EHLog(LogType,       
       int, 
       const char*,           
       int, 
       const char*,           
       ...) = 0;           

     virtual ~Logger(){}           
}; 

因为日志现在是分开从而清除了代码。

+4

查看现有的开源日志库(log4cxx,Pantheios)以了解一个想法吗? – DumbCoder 2010-10-15 09:16:42

+0

我想回答这个特定的问题。那些库是巨大的,我不想通过他们的atm。 :) – nakiya 2010-10-15 10:06:12

+0

不需要通过代码。至少浏览头文件以获得各种想法! – DumbCoder 2010-10-15 10:16:46

回答

1

支持多级日志消息的大多数日志记录库仅使用一个函数来生成消息,并且此函数采用指示日志消息级别的附加参数。

在你的结构,可能看起来像这样的:

class ErrorHandler                
{ 
    private: 
     virtual void RaiseError(bool, int) = 0;      
     virtual void RaiseWarning(int) = 0;         
     virtual void RaiseMsg() = 0;           
    public: 
     enum LogLevel { 
      ERROR, 
      WARNING, 
      MSG 
     }; 

     __attribute__((format(printf, 2, 3))) 
     virtual const char* EHPrint(enum LogLevel, const char*, ...) = 0;      

     virtual ~ErrorHandler(){}            
}; 

一些额外的点,你必须要考虑:

  1. 可变参数的功能并不安全与非POD类型使用。如果您使用printf风格的函数进行日志记录,则您的用户仅限于记录原始类型。像std::string这样的类不能使用
  2. 使用准备消息并发送消息的双向呼叫设置,您必须准备好在呼叫RaiseXXX函数之一之前多次呼叫EHPrint

此外,我第二次来自DumbCoder的评论来看看现有的日志库,只要看看它们在设计和/或API中的共同之处。

+0

事情是,我们已经有一个日志库。这个类不应该是一个错误记录器,而是一个错误处理器。这是我在标题中的错误。将编辑。这也使我清楚。错误处理和错误消息记录应该是分开的。我会去做。感谢您的建议。 – nakiya 2010-10-15 10:32:56