程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 軟件中的錯誤收集策略

軟件中的錯誤收集策略

編輯:關於C語言

 

    Error = 0 的程序是不存在的,怎樣收集和處理程序中的錯誤?怎樣更好地利用錯誤信息的收集和反饋來協助程序的調試?怎樣讓產品發布後,用戶能夠反饋出更有價值的問題信息?這些問題是本文將要涉及的,最近對自己所做項目中的錯誤處理機制做了一些總結與思考,故在此討論,希望對大家有所幫助。

    目前,按照我個人的理解,軟件中的錯誤收集和反饋方式主要有如下幾種:

第一種方式:使用常用的信息輸出語句。

    對於控制台程序,可以使用 printf 語句或者 std::cout 將錯誤信息打印出來;對於MFC程序,可以使用 TRACE 宏,將錯誤信息輸出到 output 窗口,或者使用 MessageBox直接彈出對話框將錯誤信息告知用戶 。

    這些處理策略往往針對於 “交互性” 的代碼段,可以實現 實時反饋錯誤信息,以供用戶實時地進行處理,以免後面產生更大的錯誤。

第二種方式:使用錯誤日志方式

    思想:將程序中的所有錯誤信息輸出到錯誤日志文件中,這樣有以下這些好處:

    1.  當程序發布後,客戶在使用中遇到問題後,可以直接將錯誤日志發送給程序員,將極大地方便了問題的定位及原因的分析。

    2.  便於調試多線程或者涉及網絡通信等復雜的程序,因為在這樣的程序中,設置斷點的調試方式非常地不方便,一旦暫停在斷點處,往往為引起線程異常或者 網絡連接斷開等問題,極大影響了調試的效率。如果將錯誤信息打印到文件中,錯誤描述詳細豐富一些,可以極大地提高調試的效率。

    3.  便於程序進行大規模的性能測試。例如:C/S模式的系統,進行100個客戶端對服務器的訪問測試,使用這種錯誤收集策略可以方便地通過分析錯誤日志文件來推測系統的性能。

    下面思考這樣一個問題:很多軟件的設計上都有一個類似TCP/IP協議的應用層的模塊,該模塊一般是直接與客戶端交互的一層,它隔離了核心代碼模塊與客戶端的耦合,那麼,對於這樣一種層次結構比較深設計方案,最底層發生的錯誤信息怎樣傳遞到最上層?每一層都提供獲取錯誤信息的接口?這樣開銷太大,也往往不夠理想,那該怎樣處理呢?

    我想應該主要有以下兩種處理策略,也就是我即將引出的錯誤收集和反饋的第三種和第四種策略:

第三種方式:C++異常機制

    C++異常處理機制是一個用來有效地處理運行錯誤的非常強大且靈活的工具,它提供了更多的彈性、安全性和穩固性,克服了傳統方法所帶來的問題.

    異常的拋出和處理主要使用了以下三個關鍵字: try、 throw 、 catch 。

    拋出異常、捕獲異常 ,這些是C++提供的極其方便地處理異常策略,可以實現在最底層拋出異常,由最上層捕獲,並且處理。

    說實話,C++異常機制的確是一種處理錯誤和異常的很好的策略,如果需要使用該機制,需要從軟件架構和設計時就要開始考慮,一旦軟件結構和代碼寫到一定程度後,再引入異常機制將很難達到很好的效果。其實,要想用好c++異常機制,不是一件很容易的事,特別是對於項目組裡面有大量新人的時候,故使用成本還是挺高的。

    關於C++異常機制很多C++書籍都有介紹,我也不在此贅述,本博客也有一篇C++異常機制的入門示例代碼,有興趣可以看看 http://ticktick.blog.51cto.com/823160/191881。

第四種方式:GetLastError模式

    經常開發windows程序的人應該都了解,windows程序有一個API:GetLastError,它其實代表著一種錯誤收集處理機制。 

    當一個Windows函數檢測到一個錯誤時,它會使用一個稱為線程本地存儲器(thread-localstorage)的機制。當函數返回時,它的返回值為flase就能指明一個錯誤已經發生。若要確定這是個什麼錯誤,可以調用GetLastError函數來獲取:該函數只返回線程的32位錯誤代碼。

    WinError.h頭文件包含了Microsoft公司定義的錯誤代碼的列表。

    當Windows函數運行失敗時,應該立即調用GetLastError函數。如果調用另一個Windows函數,它的值很可能被改寫。

    Visual studio還配有一個小的實用程序,稱為Error Lookup.

    如果在編寫的應用程序中發現一個錯誤,可能想要向用戶顯示該錯誤的文本描述。Windows提供了一個函數,可以將錯誤代碼轉換成它的文本描述。該函數稱為FormatMessage。

    以上就是GetLastError模式的介紹,可以簡單地把它想象成為這樣一種模式:有一個全局的變量,可以用來存放32位錯誤代碼,一旦Windows函數運行失敗,就將錯誤代碼賦值給這個全局的變量,每當調用GetLastError,則將該錯誤代碼返回出來以供外部分析原因。

    其實,我們自己也可以實現這樣一個GetLastError模式的錯誤收集機制,收集整個程序中最新的錯誤信息,供上層及時調用查詢,定義自己的錯誤代碼和錯誤描述信息串,那麼,怎樣才能更好地實現屬於自己的類似的錯誤收集反饋機制呢?怎樣使它具有更好地移植性、健壯性支持多線程等)和易擴展性加入新的錯誤代碼和信息)呢?我將在後面的文章中介紹我的思考和設計。

    以上就是我對軟件中的錯誤收集策略的思考和總結,希望對各位有所幫助,也歡迎大家提出意見和建議。

 

 

本文出自 “對影成三人” 博客,請務必保留此出處http://ticktick.blog.51cto.com/823160/213580

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved