我嘗試使用下面的C#語句崩潰LINQPad4:LINQPad和未處理的異常
new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();
顯示未處理的異常對話,但這一進程不會死亡。我想IsTerminating = true就像所有的UnhandledThreadExceptions一樣......它是如何阻止死亡過程的呢?
我嘗試使用下面的C#語句崩潰LINQPad4:LINQPad和未處理的異常
new Thread(() => new Thread(() => { throw new Exception(); }).Start()).Start();
顯示未處理的異常對話,但這一進程不會死亡。我想IsTerminating = true就像所有的UnhandledThreadExceptions一樣......它是如何阻止死亡過程的呢?
它有所有非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());
}
}
}
但未處理的線程異常始終終止應用程序。 LINQPad如何忽略該部分? –
它不是未處理的,它在線程內部未處理,但LINQPad正確處理它。 –
只要確保我得到這個權利。這工作,但如果我創建另一個AppDomain,它會崩潰 - 對嗎?(除非我將該處理程序添加到該AppDomain,即是)。 –
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#代碼的最佳工具之一,我可以用相對容易的感覺將它們粘貼到應用程序中,他們將表現爲觀察到的。
對不起,我不能幫助自己。 *爲什麼*你想要這樣做? –
哈。嘗試在我的某個應用中添加相同的功能。 :P –
我喜歡這個問題! :-) –