2009-01-02 34 views
0

我們有一個ASP.NET應用程序,它使用異常處理應用程序塊將異常記錄到數據庫(間接使用日誌記錄塊)。這一切工作完美。但是,因爲它使用異常處理塊來記錄數據,所以每次我們想要登錄時,都必須new'd一個System.Exception對象。由於我們沒有拋出異常,所以沒有性能問題。但是,每次我們想記錄一些東西時,我們都必須創建一個新的異常對象。這是一個糟糕的設計?企業庫中異常處理塊的使用

回答

0

我不會這麼說。它是一個異常處理塊,而不是一個日誌塊。也許你應該用EL的LAB來代替?

順便說一句,我喜歡和使用ELMAH作爲異常處理塊。它也不是爲記錄而設計的,只是爲了處理異常並將它們記錄下來供日後檢查。但是,我認爲有一種方法可以在不新建Exception對象的情況下引發異常事件。

0

既然你已經在使用記錄應用程序塊和EL(哪怕是間接的),你就應該能夠通過它,而不是僅僅newing了一個異常的日誌記錄登錄到數據庫。

我太喜歡ELMAH的異常處理。我將它用於未處理的異常日誌記錄,並將log4net用於所有其他日誌記錄。

3

您可以獨立於異常處理策略定義日誌記錄策略,它們不必一起使用。

異常處理和記錄許多次通過聽衆鏈接一起使用。例如,您可以捕獲catch塊中的特定錯誤並引用您的異常處理策略,該策略還可以包括通過logCategory執行的日誌記錄操作。

在另一方面,執行某些事件/動作只是記錄,只是指定不從異常處理策略中引用的日誌跟蹤偵聽器。用Trace.Write語句輸出您的日誌消息。

無論如何,如果你創建不同的策略,你可以根據需要聽衆鏈時更大的靈活性。

更新: 在您的loggingConfiguration部分中,配置另一個Trace Listener。然後,您需要在web.config的categorySources部分下添加偵聽器。下面顯示的是登錄到兩個來源,事件日誌和一個XML文件。

<categorySources>  
<add switchValue="All" name="Database Events"> 
    <listeners> 
     <add name="Formatted EventLog TraceListener"/> 
     <add name="XML TraceListener"/> 
    </listeners> 
</add></categorySources> 

根據您的exceptionHandling部分,確保連線了你的「數據庫事件」 categorySource你的政策:(一些細節省略可讀性)

<exceptionHandling> 
<exceptionPolicies> 
    <add name="Data Access Policy"> 
      <exceptionTypes> 
       <add type="System.OverflowException, mscorlib, ... postHandlingAction="NotifyRethrow" name="OverflowException"> 
        <exceptionHandlers> 
         <add logCategory="Database Events" eventId="100" ... severity="Critical" name="Logging Handler"/> 
         <add exceptionMessage="Overflow Exception caught." ... > 
        </exceptionHandlers> 
       </add> 
      </exceptionTypes> 
    </add> 
</exceptionPolicies></exceptionHandling> 

所以,最終的結果在這種情況下鏈接兩個從一個策略引用的聽衆。請注意,它是從system.overflow異常類型處理的 - 只是一個示例,說明如何爲不同的異常指定不同的處理程序。

當然,你可以只添加一個日誌文件監聽器,當你需要,而不必依賴於異常處理記錄事件/動作從你的代碼中調用它。讓我知道你是否想要更多的細節。

+0

您是否有任何示例或鏈接來演示鏈接不同的策略? – Herman 2009-01-05 17:45:38