2009-07-21 43 views

回答

5

根據我的經驗,這裏的策略屬於幾個陣營。

  • 使用全局變量ala errno。工作原理本質上任何函數都可以在全局變量中存儲錯誤代碼,因此在執行該函數之後,可以讀取錯誤代碼以查看它是否正確執行。在多線程環境中工作時,存在一些明顯的問題。雖然它appears POSIX.1c指定解決這個問題。

  • 每個函數都返回一個錯誤代碼。例如:

    RESULT_CODE my_function(int param1, int param2); 
    
    RESULT_CODE error_code = my_function(10, 2); 
    

這種方法的問題是,你失去了你與直接從函數的返回值的能力。

  • 每個函數都有一個額外的參數來存儲結果代碼。例如:

    void my_function(int param1, int param2, RESULT_CODE *err); 
    
    RESULT_CODE error_code; 
    my_function(10, 2, &error_code); 
    switch (error_code) 
    { 
        case RESULT_OK: 
         // all OK 
         break; 
        case RESULT_NO_MEM: 
         // out of memory 
         break; 
        // etc... 
    } 
    

我已經看到了這種方法在商業RTOS成功使用,個人更喜歡它,因爲我覺得這是最嚴格的。唯一的潛在缺點是你必須顯式聲明一個變量來存儲錯誤代碼,即使你不關心結果。但從某種意義上說,我確實喜歡這種要求,因爲它迫使你不斷思考錯誤是如何處理的。

1

這些都是你需要定義基本的東西:

  • 跟蹤級別(例如,調試,警報,警告,信息,關鍵等)。您還應該設置當前跟蹤級別,因此如果當前跟蹤級別爲INFO,則打印所有跟蹤級別高於info的消息。如果當前跟蹤級別很關鍵,那麼只會打印關鍵的消息。

    enum _TraceLevelType 
    { 
     INFO = 0, 
     DEBUG, 
     WARNING, 
     ERROR, 
     CRITICAL 
    } TraceLevelType; 
  • 錯誤代碼,我認爲最好的辦法是有一個大的枚舉。事情是這樣的:

    enum _ErrorType 
    { 
     //Internal errors 0-100 
     APPLICATION_FAILURE = 0, 
     ... 
     MEMORY_FAULT, 
     //UI ERRORS 101-200 
     INVALID_OPTION_SELECTED = 101, 
     .... 
     ... 
    }ErrorType; 

  • 一個消息隊列,你應該有一個機制,每個人都可以發送消息和這些消息是正確排隊。由於您在嵌入式系統上工作,所以這非常重要。您不想花時間在實時操作系統上打印調試消息。因此,管理錯誤代碼的線程應該具有非常低的優先級,並且所有接收到的消息都應該發佈到隊列中,所以當調度程序決定調用它時,您將printfs發送到控制檯或輸出到您決定的任何輸出。

所以你的錯誤方法是這樣的:


TraceError(TraceLevelType traceLevel, ErrorType errorType, char *msg) 
{ 
    if(CURRENT_TRACE_LEVEL <= traceLevel) 
     /* Ignore message */ 
    else 
     /*Queue the Message*/ 
}   

你也可以有更多的參數,以指示模塊發送的錯誤,但我認爲這基本上是它。

相關問題