2013-01-07 40 views
6

假設我建立一個ASP.NET Web API應用程序,它具有以下結構:投擲或不扔從由ASP.NET的Web API層所消耗的方法異常

enter image description here

由於您可以從圖中看到,ASP.NET Web API核心將與域服務層(例如MembershipService類,其具有諸如GetUsers,CreateUser等的方法)進行對話,並且我的服務類將與一個或多個存儲庫進行通信以處理操作。

很明顯,服務操作(如MembershipService.CreateUser方法)會由於多種原因(未滿足的條件,存儲庫拋出的異常等)而失敗,這是我懷疑的地方。

你認爲服務類應該處理異常,並返回某種結果對象,如下面的一個:

public class OperationResult { 

    public OperationResult(bool isSuccess) : this(isSuccess) { 
     IsSuccess = isSuccess; 
    } 

    public OperationResult(bool isSuccess, Exception exception) : this(isSuccess) { 
     Exception = exception; 
    } 

    public bool IsSuccess { get; private set; } 
    public Exception IsSuccess { get; private set; } 
} 

public class OperationResult<TEntity> : OperationResult { 

    public OperationResult(bool isSuccess) 
     : base(isSuccess) { } 

    public OperationResult(bool isSuccess, Exception exception) 
     : base(isSuccess, exception) { } 

    public TEntity Entity { get; set; } 
} 

或者你認爲該服務方法不應該抽象異常這樣的,應該直接或間接拋出異常(創建一個特定於操作的新的有意義的異常類型,並將拋出的異常作爲其內部異常)?

+0

誰想關閉這個問題,因爲沒有建設性?請告訴我你用什麼來獲得高的利茲,據我所知,它正在發揮作用。 – tugberk

回答

3

當您在進行中時,請使用例外。

+0

謝謝!你願意拋出異常流還是將其封裝在更有意義的自定義異常類型中? – tugberk

+0

@tugberk這是一個很大的問題。遵循分層體系結構的規則,你應該換行。這是正確的做法嗎?我不知道。 –

+0

我明白了。謝謝您的幫助。例如,如果給出必要的含義(例如'ArgumentNullException'),我更喜歡已有的.NET異常。 – tugberk

1

從微軟的書中可以看出,Membership API的實現拋出異常而不是處理它們並返回一個結果對象,所以我認爲這是一個最佳實踐,只要你不控制客戶端和API。

在確實控制客戶端和API的情況下,我個人偏好返回結果對象或錯誤消息。原因是我想記錄捕獲有關實際異常源的詳細信息,但我不希望出現任何可能出錯的異常,例如密碼不正確。

在這種情況下,給用戶的簡單錯誤信息就足夠了。從現實世界的經驗來看,每次發生驗證錯誤時,將事件記錄記錄到事件日誌或日誌文件是操作人員的主要負擔,這些操作人員試圖確定是否存在實際故障或者是否只是用戶的打字錯誤。

2

我沒有看到避免例外的任何一點。例外情況有很好的理由,主要用於! 只是試圖看看大圖:你正在嘗試改變錯誤檢查舊的時尚方式的異常機制。這樣你將失去Exceptions的所有優點(比如分離錯誤處理和常規代碼,CallStack,...),並且不會獲得任何回報。

我在這種情況下通常會做的是捕獲服務層中的異常,並將其重新封裝到自定義異常(引用InnerException字段中的原始異常)。