2011-09-22 39 views
3

我嘗試使用下面的C#語句崩潰LINQPad4:LINQPad和未處理的異常

new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start(); 

顯示未處理的異常對話,但這一進程不會死亡。我想IsTerminating = true就像所有的UnhandledThreadExceptions一樣......它是如何阻止死亡過程的呢?

+2

對不起,我不能幫助自己。 *爲什麼*你想要這樣做? –

+0

哈。嘗試在我的某個應用中添加相同的功能。 :P –

+2

我喜歡這個問題! :-) –

回答

5

它有所有非UI線程例外全局異常處理程序,以及在主要方法是這樣的:

AppDomain.CurrentDomain.UnhandledException += 
     new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

還有其他小的事情要做,當然再加上像往常一樣在try /趕上Application.Run。

看到一個完整的文章和細節在這裏:C# Tutorial - Dealing With Unhandled Exceptions

編輯: HB。嘗試調試這一個:;-)

using System; 
using System.Threading; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    static class Program 
    { 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

      new Thread(() => new Thread(() => { throw new ApplicationException("Ciao"); }).Start()).Start(); 

      try 
      { 
       Application.Run(new Form1()); 
      } 
      catch (Exception exc) 
      { 
       System.Diagnostics.Debug.WriteLine(exc.Message); 
      } 
     } 

     static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
     { 
      // here catching Unhandled Exceptions 
      System.Diagnostics.Debug.WriteLine(e.ExceptionObject.ToString()); 
     } 
    } 
} 
+0

但未處理的線程異常始終終止應用程序。 LINQPad如何忽略該部分? –

+0

它不是未處理的,它在線程內部未處理,但LINQPad正確處理它。 –

+1

只要確保我得到這個權利。這工作,但如果我創建另一個AppDomain,它會崩潰 - 對嗎?(除非我將該處理程序添加到該AppDomain,即是)。 –

1

LINQPad似乎不僅執行其查詢,但也加載其自己的AppDomain內的依賴關係。如果你在你的應用程序中創建了一個新的AppDomain,你可以以友好的方式處理異常並以友好的方式重新加載/編譯應用程序。

更有趣的是LINQPad如何處理它的依賴關係。顯然,當它們被加載到這些AppDomain中時,它們會被「複製」,因爲我有一個自定義庫,我可以對它進行「即時」更改,並且LINQPad不會鎖定文件;相反,它好像有一個FileSystemWatcher,它查找文件的更改,卸載AppDomain,然後用新的依賴關係重新加載AppDomain。

構建一個新庫之後,在應用程序中「暫停」,然後添加了我添加的新「方法」,現在可通過intellisense向腳本提供,表明LINQPad在處理腳本和引用庫時相當智能:a )不僅改變;但b)可能導致它崩潰。

但是,如果您確實想要獲得一些樂趣,則始終可以使用System.Diagnostics.Debugger.Break()。如果關閉LINQPad屬性中腳本的優化,則實際上可以調試到LINQPad過程,在Visual Studio調試器窗口中獲取源代碼,放置斷點,逐步檢查變量等,以便實際調試'您在LINQPad中創建的代碼片段。這是腳本中的一些額外的行,但如果您在LINQPad中執行一些重要的腳本/測試,那麼值得。

這仍然是我能夠找到原型,單元測試和建立使用LINQ查詢的C#代碼的最佳工具之一,我可以用相對容易的感覺將它們粘貼到應用程序中,他們將表現爲觀察到的。