2013-11-27 24 views
1

最近,我一直在閱讀如何正確處理異常以改進我的軟件(避免捕獲泛型異常和所有異常),但我仍然有點困惑。這是我目前所做的(違反了一些良好的做法,或者可能都是)Web應用程序,在這裏使用示例來捕獲異常的正確方法是什麼?

ASP.NET web應用程序調用業務層,它返回調用數據訪問層。使用的日誌框架是log4net,它會在發生異常時記錄下來給我發電子郵件。

數據訪問層捕獲泛型異常(是的,不好,因爲我不知道網絡是否可能是問題,或者如果存儲過程的輸入是錯誤的類型等)將其記錄爲致命的然後「扔」; (保持堆棧跟蹤)。

catch(Exception ex) 
{ 
    log.Fatal("Exception occurred while inserting task into database",ex); 
    throw; 
} 

* 注意,我的數據訪問層假定所有輸入驗證在上層做,但有時候,我錯過檢查一個或兩個參數。

業務層捕獲「通用」的異常,以及(包括數據訪問除外),然後圍繞一個新的異常包裝在

catch(Exception ex) 
{ 
    log.Fatal("Exception occurred while creating the task ", ex); 
    throw new exception("There appears to be an error while doing [name of business operations]", ex) 
} 

Web應用程序層捕獲從業務層的任何異常並顯示錯誤信息。

catch(Exception ex) 
{ 
    //show Ex.Message to the user on the current UI. 
} 

此外,爲了將用戶重定向到一個通用的「接觸管理」的錯誤頁面一個全球性的錯誤消息。

從我看過的所有內容看,似乎我所做的一切都是錯誤的。在這種情況下,使用上面的例子,我應該如何正確處理每個級別的異常?

  • 數據訪問
  • 業務層
  • Web應用程序

回答

1

我相信,除非你需要做的,你不應該趕上像DAL或業務層中的任何內層異常(建模洋蔥層)除了日誌以外的事情。

我相信所有例外都應該冒泡到最外層,它可以是您的web層或控制檯項目。基本上你的啓動或執行模塊/項目應該負責在一個地方處理和記錄異常。

在ASP .NET MVC的情況下,我會在自定義HandleErrorAttribute下執行,如果需要,還可以在global.asax文件中的Application_Error下執行。

相關問題