2008-09-21 64 views
6

我正在尋找比我們目前需要處理的更好的解決方案意外的生產錯誤,而無需重新發明輪子。在.NET窗口應用程序中收集/報告意外錯誤的最佳方法是什麼?

我們的更多產品是安裝在遠程站點的WinForm和WPF應用程序。不可避免的意外錯誤發生,從NullReferenceExceptions到'一般網絡錯誤'。從程序員錯誤到環境問題。

目前,所有這些未處理的異常使用log4net的記錄,然後通過電子郵件發送給我們的分析。但是,我們發現有時這些錯誤「報告」包含的信息太少,無法識別問題。

在這些報告中,我們需要的信息,如:

  1. 應用程序名稱
  2. 應用程序版本
  3. 工作站
  4. 也許一個屏幕截圖
  5. 異常詳細
  6. 操作系統
  7. 可用RAM
  8. 正在運行的進程
  9. 等等...

我真的不希望通過從頭開發這個重新發明輪子。需要的組件:(如上所述細節)

  1. 錯誤收集
  2. 錯誤「發件人」(排隊所需如果DB或互聯網是不可用)
  3. 錯誤數據庫
  4. 分析這些錯誤報告。例如。在下午4點到5點之間發生10次最常見的錯誤或超時。版本x和y之間的錯誤如何比較?

注: 我們看了SmartAssembly作爲一種可能的解決方案,但雖然接近它並沒有完全滿足我們的需要,我希望聽聽其他開發人員做的,如果一些替代品存在。

編輯:感謝您的回答。也許在我原來的問題中我並不清楚,問題不在於如何捕捉所有未知的異常,而是如何處理它們並在其周圍創建報告引擎(分析)。

+0

嗨,我感興趣的是什麼是意味着SmartAssembly並沒有完全滿足您的需求? – 2010-06-24 08:52:58

回答

5

我建議傑夫阿特伍德關於User Friendly Exception Handling的文章,它大部分都是你問的(應用程序信息,截圖,異常詳細信息,操作系統,日誌記錄到文本文件和電子郵件),幷包含源代碼,額外的東西,你需要。

+0

感謝這一步朝着正確的方向發展。我閱讀了這篇文章,它提供瞭解決部分問題的方法(收集錯誤)。正如你所提到的,它需要滿足我們的特定需求,但至少它提供了一個開始。 我希望有其他東西存在分析這些錯誤。 – 2008-09-22 08:34:04

2

您可以附加到未處理的異常事件,並記錄/擊中一個Web服務/等。

[STAThread] 
static void Main() 
{ 
    Application.ThreadException += new ThreadExceptionEventHandler(OnUnhandledException); 
    Application.Run(new FormStartUp()); 
} 
static void OnUnhandledException(object sender, ThreadExceptionEventArgs t) 
{ 
    // Log 
} 

我還發現使用的AppDomain代替ThreadException這個代碼片段:

static class EntryPoint { 
    [MTAThread] 
    static void Main() { 
     // Add Global Exception Handler 
     AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(OnUnhandledException); 

     Application.Run(new Form1()); 
    } 

    // In CF case only, ALL unhandled exceptions come here 
    private static void OnUnhandledException(Object sender, 
     UnhandledExceptionEventArgs e) { 
     Exception ex = e.ExceptionObject as Exception; 
     if (ex != null) { 
      // Can't imagine e.IsTerminating ever being false 
      // or e.ExceptionObject not being an Exception 
      SomeClass.SomeStaticHandlingMethod(ex, e.IsTerminating); 
     } 
    } 
} 

下面是一些關於它的資料:AppDomain Unhandled Exception的只是自己處理它

之外,確實沒有一個通用的方式來做到這一點是可重用的,它確實需要與應用程序的界面正確地集成,但你可以設置一個web服務,它接受應用程序名稱,異常和所有好東西,併爲所有人你的應用。

0

您可能想研究JetBrain的Omea Reader內置的錯誤報告功能。它有一個全面的錯誤處理組件,當發生意外錯誤時會彈出一個對話框。在將問題提交給JetBrain的公共錯誤收集Web服務之前,用戶可以輸入更多細節。

他們提出OMEA開源,讓社區升級.NET 1.1的代碼庫,以V2或3 http://www.jetbrains.net/confluence/display/OMEA/this+link

相關問題