2009-11-10 52 views
3

我正在使用我的MCTS,並正在研究AppDomain功能。但我遇到了一些不清楚的事情。 AppDomain應該捕獲Exception並允許域安全地卸載。 (隨着StackOverflowException的可能除了其他地方建議)AppDomain引起的異常不應該引起異常?

AppDomainSetup setup = new AppDomainSetup(); 
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; 
Evidence adevidence = AppDomain.CurrentDomain.Evidence; 
domain.UnhandledException += new UnhandledExceptionEventHandler(domain_UnhandledException); 
AppDomain domain = AppDomain.CreateDomain("MyDomain", adevidence, setup); 

當我決定在我爲這個目的,我應該得到一個安全創建的組件創建示例類的實例,限制域名將捕捉髮生並可以安全卸載的錯誤。至少這是我從我的學習書中瞭解到的。

var type = (IDoSomeWork) domain.CreateInstanceAndUnwrap("Library1", "Library1.Class1"); 
type.Run(); 

然而,這引發了一個例外type.Run()(因爲我這樣做)。但不應該安全地捕獲它嗎?這不就是爲什麼我們有AppDomain

UPDATE:

按照要求,我已經包括了Library1.Class1的定義。此外,爲了清楚起見,UnhandledExceptionEventHandler對捕獲異常沒有影響,並且與問題無關。

[Serializable] 
public class Class1 : MarshalByRefObject, IDoSomeWork 
{ 
    public void Run() 
    { 
     Debug.WriteLine(AppDomain.CurrentDomain.FriendlyName); 
     throw new ApplicationException(String.Format("{0}", this.ToString())); 
    } 
} 

我已經驗證了它在MyDomain運行。

+0

請給出Library1.Class1的定義。 – leppie 2009-11-10 19:25:01

回答

2

UnhandledException事件不會捕獲例外傳統意義上,像一個try-catch塊(據我所知),它僅僅是一個信息點,讓您在執行日誌記錄和這樣的任務。

MSDN documentation引用:

此事件提供的 捕獲的異常的通知。它允許 應用程序在系統 默認處理程序向用戶報告例外 並終止 應用程序之前記錄有關 異常的信息。

因此,異常仍會冒泡到系統默認的異常處理程序。

+0

爲什麼ApplicationDomain中不包含異常呢?我不確定這完全回答了這個問題。 – 2009-11-10 19:37:36

+0

@泰勒:因爲這個事件不是爲了這樣工作的。該文檔明確指出,事件處理程序允許應用程序在系統默認處理程序向用戶報告異常並終止應用程序*之前收集信息*。這個活動的目的不是作爲一個全球性的catch catch。 – 2009-11-10 19:40:53

+0

我認爲這個問題的主要觀點是關於爲什麼默認的AppDomain獲得異常。例如,如果自定義(非默認)域沒有UnhandledExceptionEventHandler,會發生什麼情況? – 2009-11-10 19:46:31

0
AddHandler Application.ThreadException, AddressOf MyExceptionHandler.HandleException 

添加一個頂級異常處理程序,但它可能不會做你想要的在這種情況下。