在匿名方法中抛出(并捕获)异常

时间:2010-12-06 14:09:26

标签: c# .net

我有以下问题。我想捕获异常,如下所示,而不是我得到NullReferenceException。有没有办法捕获此匿名方法内部抛出的异常?

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);

我将不胜感激。

4 个答案:

答案 0 :(得分: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 :(得分:1)

我怀疑你得到NullReferenceException,因为_debug_curr_ui为null。

否则你应该能够包装你在try / catch块中发布的代码并捕获excpetion。您还应该考虑使用ApplicationException而不是Exception。

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

MSDN ApplicationException

答案 2 :(得分:0)

如果我理解正确,您希望匿名委托抛出异常,并且您希望在匿名委托之外的某处捕获此异常。

为了回答这个问题,我们需要知道你在委托中实际做了什么,以及如何调用它。或者,更具体地说,_debug_curr_ui.Send方法对委托做了什么?

答案 3 :(得分:0)

如下所示

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