2010-12-06 46 views
1

我有以下問題。我想要捕獲如下所示的異常,而不是我得到NullReferenceException。有沒有辦法捕捉到這個Anonymous方法中拋出的異常?以匿名方式投擲(捕捉)異常

SynchronizationContext _debug_curr_ui = SynchronizationContext.Current; 

_debug_curr_ui.Send(new SendOrPostCallback(delegate(object state) { 
      throw new Exception("RESONANCE CASCADE: GG-3883 hazardous material failure"); 
}),null); 

我將不勝感激任何幫助。

回答

1

你仍然可以使用try/catch您的匿名方法內部:

_debug_curr_ui.Send(new SendOrPostCallback(delegate(object state) { 
    try 
    { 
     throw new Exception("RESONANCE CASCADE: GG-3883 hazardous material failure"); 
    } 
    catch (Exception ex) 
    { 
     // TODO: do something useful with the exception 
    } 
}), null); 

作爲替代方案,你可以修改這個Send方法,只是調用委託之前捕獲異常:

public void Send(SendOrPostCallback del) 
{ 
    // ... 

    try 
    { 
     del(); 
    } 
    catch (Exception ex) 
    { 
     // TODO: do something useful with the exception 
    } 

    // ... 
} 
+1

如果你要扔,然後立即捕獲並處理你可能也不會拋出呢? – TimC 2010-12-06 14:26:24

0

如果我沒有理解正確地說,您希望匿名委託拋出異常,並且您想要在匿名委託外的某個位置捕獲此異常。

爲了回答這個問題,我們需要知道你實際上在委託中做了什麼,以及它是如何被調用的。或者,更具體地說,_debug_curr_ui.Send方法是如何處理委託的?

0

類似下面

 delegate(object obj) 
     { 
      try 
      { 
      } 
      catch(Exception ex) 
      { 
      } 
     } 
1

我懷疑你得到的NullReferenceException因爲_debug_curr_ui爲空。

否則,您應該能夠包裝您在try/catch塊中發佈的代碼並捕獲這些消息。你也應該考慮使用ApplicationException而不是Exception。

try 
{ 
    Action someMethod = delegate() { throw new ApplicationException("RESONANCE CASCADE: GG-3883 hazardous material failure"); }; 
    someMethod(); 
} 
catch 
{ 
    Console.WriteLine("ex caught"); 
} 

MSDN ApplicationException