2010-10-15 54 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

相關問題