2011-12-24 177 views
1

我現在用下面的代碼捕獲錯誤,在我服務層拋出異常:這是一種捕捉和處理異常/錯誤的有效方法嗎?

... 
      if (pk == null || rk == null) return null; 
      try 
      { 
       var item = repo.GetPkRk(pk, rk); 
       return (T)item; 
      } 
      catch (Exception ex) 
      { 
       throw new ServiceException("", typeof(T).Name + rk + " data retrieval error"); 
      } 
    ... 

的ServiceException類:

public class ServiceException : ApplicationException {  
     public Dictionary<string, string> Errors { get; set; } 
     public ServiceException() : this(null) {}enter code here 
     public ServiceException(string key, string message) 
     { 
      Errors = new Dictionary<string, string>(); 
      Errors.Add(key, message); 
     } 
     public ServiceException(Exception ex) 
      : base("Service Exception", ex) 
     { 
      Errors = new Dictionary<string, string>(); 
     } 
    } 

的錯誤信息,那麼夾在我的控制器:

catch (Exception e) { log(e); } 

最後在日誌方法中處理:

protected void log(Exception ex) 
     { 
      if (ex is ServiceException) 
      { 
       ModelState.Merge(((ServiceException)ex).Errors); 
      } else { 
       Trace.Write(ex); 
       ModelState.AddModelError("", "Database access error: " + ex.Message); 
      } 
     } 

任何人都可以評論,如果這是一個好方法或壞方法。之前我有一個關於捕捉內部異常的評論。這是可能的,如果是這樣,然後我怎麼可以捕捉並保留內部異常細節。

更新1

我修改的異常類,以便有一個構造函數前。不知道這個理想,但我認爲它的工作原理。任何更多的建議,如何改善將不勝感激。下面

更新2

代碼失敗,提示信息說

Error 2 Property or indexer 'System.Exception.InnerException' cannot be assigned to -- it is read only 

我不知道如何解決這個問題。

public class ServiceException : ApplicationException { 

    public Dictionary<string, string> Errors { get; set; } 
    public ServiceException() : this(null) {} 
    public ServiceException(Exception ex, string key, string message) 
    { 
     Errors = new Dictionary<string, string>(); 
     InnerException = ex; 
     Errors.Add(key, message); 
    } 
    public ServiceException(string key, string message) 
    { 
     Errors = new Dictionary<string, string>(); 
     Errors.Add(key, message); 
    } 
    public ServiceException(Exception ex) 
     : base("Service Exception", ex) 
    { 
     Errors = new Dictionary<string, string>(); 
    } 
} 
+0

請參閱答案。我修改了它。 – 2011-12-24 06:32:13

+0

不要從'ApplicationException'派生:http:// stackoverflow。com/questions/52753/should-i-derived-custom-exceptions-from-exception-or-applicationexception-in-net,http://blogs.msdn.com/b/kcwalina/archive/2006/06/23/ 644822.aspx – 2011-12-24 08:04:32

回答

1

首先

包括捕獲到的異常作爲內部異常

所以不是

throw new ServiceException("", typeof(T).Name + rk + " data retrieval error"); 

應設置內部異常。改變你的構造

public ServiceException(string key, string message, Exception innerException) 
      :base(message, innerException) 
     { 
      Errors = new Dictionary<string, string>(); 
      Errors.Add(key, message); 
     } 

現在,

//form your exception message 
var message = typeof(T).Name + rk + " data retrieval error"; 
//create service exception with the new overloaded constructor 
var exception = new ServiceException("", typeof(T).Name + rk + " data retrieval error", message); 
throw exception; 

這將保留您的內部異常。

+0

感謝您的建議。我可以通過構造函數參數傳遞InnerException嗎? – 2011-12-24 03:46:54

+1

是的,你可以! – Matthias 2011-12-24 03:49:11

+0

@Matthias - 謝謝。我更新了我的代碼,希望看起來不錯。 – 2011-12-24 04:07:24