2012-06-04 26 views
3

處理異常我有一個ASP.NET Web Forms應用程序與UI服務層庫層如何在多層的ASP.NET Web應用程序

一些在我服務層的方法與一個Web服務進行通信,因此,我想換都到Web方法的調用在Try-Catch-Finally結構。

假設我有我的服務層以下方法:

public RegistrationDetails GetRegistrationDetails(int userId) 

public bool RegisterUser(UserData myUserData) 

RegistrationDetailsmyUserData的對象類型(類)。

我擔心的是:如果我創建一個Try-Catch-Finally來包裝調用Web服務上面列出的方法的實現中,如果有一個例外,我怎麼能返回的消息字符串如果返回類型RegistrationDetailsbool

我在考慮給每個返回對象添加一個屬性,但我不知道這是否是一個好的解決方案。例如,而不是使用bool

public class RegisterResponse 
{ 
    public bool isRegistered { get; set; } 
    public string ExceptionMessage { get; set; } 
} 

public RegisterResponse RegisterUser(UserData myUserData) 

,然後檢查ExceptionMessage是nullString.Empty。這是一個好方法嗎?由於

+0

我通常讓異常冒泡到一個窗體並在那裏處理它。當您在較低級別捕獲特定異常時,可能是因爲錯過了某處之間錯誤的真正原因。在較低的水平,我只是把它們扔出來...... – IrishChieftain

+0

感謝您的回答。我想捕捉所有異常的原因是爲了避免用戶看到典型的ASP.NET錯誤頁面。我想要處理它們並向用戶(通過用戶界面)顯示最佳信息,以便簡化問題解決過程。 – CiccioMiami

回答

0

1)正如IrishChieftain提到,鼓泡異常下降到形式是好的,你就可以將異常更好地應對

2)您也可以有一個參考參數作爲數組存儲例外從方法

public bool RegisterUser(UserData myUserData, optional ref ArrayList<string> errors) 
{ 
    if(error) 
    errors.Add("This error occured") 
} 

3)對於實例化對象在所生成的消息,可以有ArrayList中的錯誤的實例變量,並且具有在屬性返回

public class MyClass 
{ 
    private ArrayList<string> errors = new ArrayList<string> 

    public ArrayList<string> ExceptionMessages() 
    { 
     get 
     { 
      return errors; 
     } 
    } 

    public RegistrationDetails GetRegistrationDetails(int userId) { } 
} 

//Used like this: 
MyClass c = new MyClass(); 
c.GetRegistrationDetails(); 

if(c.ExceptionMessages > 0) 
{ 
    //output errors 
} 

但我更喜歡第一種方法 - 對於像輸出格式化那樣的靈活性

0

將原始異常從服務傳遞到客戶端(Web表單圖層)可能有風險。如果它是數據庫異常,它可能會暴露數據庫的詳細信息。惡意用戶可能會從他們自己的應用程序中調用您的服務層方法。

你可以期望兩種類型的客戶端級別的異常:

  1. 通信異常(連接到服務問題)
  2. 服務器端錯誤(數據庫的問題,用戶名不是唯一的,密碼失效.. 。其他業務規則的例外)

第一類應在被捕獲的try-catch-終於在你的網頁表單層,但第二類應該在服務層被捕獲,記錄下來,然後在RegisterResponse包裹起來OBJ如你所建議的那樣。但是,而不是發送異常。消息,您可能會考慮使用預期錯誤的枚舉(使用ServerError成員來覆蓋其他任何內容)。您還可以將一個EventId添加到響應和日誌條目中,以便您可以調查錯誤。

在客戶端代碼
public enum RegisterResponseError { NoError = 0, SystemError = 1, 
    UserNameNotUnique, PasswordInvalid, etc. } 

public class RegisterResponse 
{ 
    public bool isRegistered { get; set; } 
    public RegisterResponseError ErrorCode { get; set; } 
} 

然後,

if(myRegisterResponse.ErrorCode == RegisterResponseError.NoError) 
    // everything was fine 
else 
    // show a suitable error message for ErrorCode and display EventId (if logging) 

你可以從你的服務返回錯誤的字符串,但它可能是更好地管理你的Web表單層的任何內容,如果你需要本地化內容或稍後使用CMS。

相關問題