How to handle exception in multicast delegate in C

2019-02-18 04:09发布

问题:

I've been given some code that I am calling through multicast delegate.

I would like to know how I can catch up and manage any exception raised there and that is not managed for the moment. I cannot modify the code given.

I've been looking around and found about the need to call GetInvocationList() but not really sure if this is helpful.

回答1:

Consider the code using GetInvocationList:

foreach (var handler in theEvent.GetInvocationList().Cast<TheEventHandler>()) {
   // handler is then of the TheEventHandler type
   try {
      handler(sender, ...);
   } catch (Exception ex) {
      // uck
   }
}   

This my old approach, the newer approach I prefer is above because it makes invocation a snap, including the use of out/ref parameters (if desired).

foreach (var singleDelegate in theEvent.GetInvocationList()) {
   try {
      singleDelgate.DynamicInvoke(new object[] { sender, eventArg });
   } catch (Exception ex) {
      // uck
   }
}

which individually calls each delegate that would have been invoked with

 theEvent.Invoke(sender, eventArg)

Happy coding.


Remember to do the standard null-guard copy'n'check (and perhaps lock) when dealing with events.



回答2:

You can loop through all the delegates registed in the multicast list and call each of them in turn while wrapping each call in a try - catch block.

Otherwise the invocations of the subsequent delegates in the multicast after the delegate with the exception will be aborted.



回答3:

The upvoted answer is for events, for delegates specifically try this extension method:

    public static class DelegateExtensions
{
    public static void SafeInvoke(this Delegate del,params object[] args)
    {
        foreach (var handler in del.GetInvocationList())
        {
            try
            {
                    handler.Method.Invoke(handler.Target, args);
            }
            catch (Exception ex)
            {
                // ignored
            }
        }
    }
}