如何全面的把握一個系統的異常處理


對於一個大的系統來說,異常處理必須要有一個總的策略和方針,並在組織內貫徹執行,否則就很難把異常處理好。

  1. 從整個系統全局的角度來看
    1. 進程內錯誤----用異常來報告錯誤(內部錯誤);底層模塊通過異常來向高層模塊報告錯誤的發生。
    2. 進程間錯誤----用ErrorCode, ErrorMessage, Action來向外部系統報告錯誤(業務錯誤),尤其是對外提供公共服務,除非是對外不公開的子系統,此時可以使用原生的異常來報告錯誤。一旦錯誤超出服務邊界,最好使用ErrorCode, ErrorMessage, Action的方式向外部報告。
  2. 從進程內不同模塊的角度來看
    1. 底層模塊:DLL,一般不需要Catch異常;盡量多的使用Try--Finally;除非定義的自己的異常。
    2. 高層模塊:EXE等,盡量在高層模塊中處理異常,報告錯誤。
  3. 從不同的系統類型的角度來講
    1. 服務型:7* 24小時,通常情況下要確保系統的任何情況下都不要Crash,系統發生的任何Exception都要有Log,有些情況下可能還需要發郵件來通知。
    2. UI型:友好的給出用戶提示信息。必要的時候可以使用AOP來在全局唯一的點來處理Exception。
  4. 實際的異常處理規則
    1. 異常類必須符合標准,必須可以序列化。
      [Serializable]
      public class ExampleException : ApplicationException
      {
      public ExampleException()
      : base()
      {

      }

      public ExampleException(string message)
      : base(message)
      {

      }

      public ExampleException(string message, Exception inner) :
      base(message, inner)
      {

      }

      protected ExampleException(SerializationInfo info, StreamingContext context) :
      base(info, context)
      {
      }
      }
    2. 不能丟掉任何一個異常,通常情況下要使用InnerException來保持原始的異常。
          try
      {
      //Read configuration from file
      ...
      }
      catch (FileNotFoundException ex)
      {
      throw new ExampleException("Can't find the configration file.", ex);
      }
    3. Catch異常后如果不Throw的話,必須Log異常。
    4. 記ExceptionLog時必須包含棧信息,也就是要使用ToString方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM