簡體   English   中英

用於日志記錄的C#類庫中未處理的異常

[英]Unhandled Exceptions in C# Class Library for Logging Purposes

我是軟件開發的新手,也是stackoverflow的新手,所以對我來說很容易。

背景:我正在開發一個C#類庫,它通過tcp / ip處理第三方應用程序發送的xml消息(使用異步套接字)。 我正在使用com-interop將類庫公開給Vb6應用程序。 當C#庫處理它通過套接字接收的xml時,它會引發消費vb6應用程序訂閱的各種事件(這樣,當我們最終在.Net中重寫整個應用程序時,我們已經完成了這個組件)。

問題:我想捕獲所有僅用於登錄的未處理異常。 在winforms應用程序中,您可以將事件連接到AppDomain.CurrentDomain.UnhandledException和Application.ThreadException。 有沒有辦法同樣抓取異常數據來記錄類庫中的信息?

重點:

  • 我不是試圖從這些異常中恢復,而只是記錄它們並讓異常傳播並在需要時崩潰應用程序。

  • 我正在盡力在本地捕獲所有特定異常,無論我知道它們可能發生在哪里。 因此,我的目的是記錄真正意外的異常。

  • 我知道有人會說這將是一個糟糕的設計模式。 我應該讓調用者處理這些異常。 問題是vb6應用程序沒有像我想的那樣具有強大的錯誤處理能力。 首先,我想記錄堆棧跟蹤,以便如果vb6應用程序因我的dll而崩潰,我可以查看日志,以便提醒我可能需要更改的c#代碼的潛在區域。

任何人都可以為我提供一些方向嗎? 到目前為止,我發現的最佳選項似乎是在每個公共方法中放置一個通用的try catch塊,記錄異常,然后拋出它。 這似乎不太理想:

public void SomeMethod()
{
    try
    {
        // try something here...
    }
    catch (Exception ex)
    {
        Log(ex);
        throw;
    }
}

這不僅看起來像一個糟糕的設計,而且我不知道如果其中一個異步回調在不同的線程上導致異常而不是調用該方法會發生什么。 這個通用的try / catch塊是否仍會捕獲這樣的異常?

謝謝你的幫助。

編輯:我最初標記@Eric J.的答案是正確的,但在嘗試實現解決方案后,我發現它不能很好地處理我正在使用的套接字類的異步回調。 一旦使用線程池線程來觸發異步回調,我似乎無法捕獲堆棧中稍后發生的任何異常。 我是否需要使用AOP框架,還是有其他方法來捕獲這些異常?

如果您對庫有一組有限的入口點,請考慮按照您的建議 - 使用.NET包裝器類或包裝器庫來執行實際的互操作,並在該包裝器類中捕獲/記錄異常。 返回一個異常或錯誤代碼,調用VB6庫知道如何處理(是否重新拋出異常取決於VB6代碼可以處理什么)。

CrazyDart建議IOC,這是一個有趣且有效的替代方案,但最初也增加了復雜性和學習曲線。 當然也要看看IOC並將其作為一種可能性。

你可以使用Castle Windsor和攔截器。 這是在項目上使用IOC的一個很好的理由。

http://blog.andreloker.de/post/2009/02/20/Simple-AOP-integrating-interceptors-into-Windsor.aspx

我已經將它們用於異常日志記錄,正如您所說的那樣,以及性能日志記錄......在許多其他事情中,您使用攔截器進行類似的事務處理。

你可以看看使用像Spring.NET或Unity這樣的AOP框架,或者看看像PostSharp這樣的產品(盡管我從未親自嘗試過PostSharp)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM