2010-01-12 77 views
2

首先,我很抱歉什麼是重複的帖子。我似乎無法將搜索範圍縮小到足夠的範圍,因此Google和Google都能找到我要找的內容。C#:我可以從CLR的未處理異常中獲取詳細信息嗎?

我目前在一家店裏工作,他們喜歡他們的例外氣泡。當編譯的應用程序進行測試時,嘗試獲取異常的詳細信息(消息和堆棧跟蹤)是一個很大的麻煩。 Windows顯示那個熟悉的盒子,沒有任何細節。

經過近一個小時的測試,發現測試盒中的水晶報告版本錯誤,我添加了這個簡單的代碼,可能很熟悉。

static void Main(string[] arg) 
    { 
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
     Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(...); 
    } 

    static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) 
    { 
     MessageBox.Show(e.Exception.ToString()); 
    } 

    static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
    { 
     MessageBox.Show((e.ExceptionObject as Exception).ToString()); 
    } 

這幹得不錯,但我不允許託運。有沒有在App.config或通過註冊表設置任何辦法讓CLR顯示或記錄異常詳細信息編譯.net應用程序?

在此先感謝您的幫助。

+1

你不能用日誌替換你的MessageBox調用,然後重新拋出異常嗎? – 2010-01-12 16:39:32

+0

您是否看過插入日誌記錄DLL,如log4net或EnterpriseLibrary日誌記錄,然後按照Martin的建議進行操作? – Paddy 2010-01-12 16:43:46

回答

1

只是使用log4net,如果你想配置你的日誌輸出。

0

我使用WPF所以這裏是所有未處理的異常泡出來的,它可能會爲你的需求是有用的:

Private Sub Application_DispatcherUnhandledException(ByVal sender As Object, ByVal e As System.Windows.Threading.DispatcherUnhandledExceptionEventArgs) Handles Me.DispatcherUnhandledException 
    'TODO: Log error' 

    Dim sb As New System.Text.StringBuilder(e.Exception.Message & vbCrLf) 

    Dim ex = e.Exception.InnerException 
    While ex IsNot Nothing 
     sb.AppendLine("______________ inner exception: ______________") 
     sb.AppendLine(ex.Message) 
     sb.AppendLine(vbCrLf) 
     ex = ex.InnerException 
    End While 

    If MessageBox.Show(sb.ToString, "Exception caught", MessageBoxButton.OKCancel) = MessageBoxResult.Cancel Then Stop 
    e.Handled = True 
End Sub 

接受我的道歉,我沒有時間去改寫它,我只是複製我的原始代碼,我相信它仍然是有益的。

感謝

0

如果您知道如何在VB.NET中編碼,Shimmy的解決方案非常方便。

然後,您可以去遞歸進入ex.InnerException.InnerException. ...等等...構建一個完整的消息

(1)如果ex.Message不是nullEmpty,顯示它。

(2)如果ex.InnerException不是null顯示ex.InnerException.Message

0

您可以選擇將調試處理代碼封裝在條件編譯符號中。這將允許您爲測試目的提供您想要的詳細日誌記錄,但在應用程序的發佈版本中,最終用戶無法使用該日誌記錄。

0

看起來您缺少Main()方法中的頂級try-catch。一個例子見one of my answers

我不會使用MessageBox,但是一種靜態方法會以您想要/需要的方式記錄問題,然後顯示一個通用的「意外致命錯誤發生。[Bla bla bla]」消息並殺死正在運行的進程。

0

你能使用Enterprise Library嗎?有異常處理和記錄塊可能對您有用。您可以將異常處理塊配置爲notify and rethrow原始異常,並使用日誌記錄塊記錄詳細信息。它可能是一個陡峭的山坡攀登,去掌握它,但我認爲這將是最值得的。

相關問題