How to handle exception in multicast delegate in C#?

南楼画角 提交于 2019-12-01 05:22:16

问题


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
            }
        }
    }
}


来源:https://stackoverflow.com/questions/5740650/how-to-handle-exception-in-multicast-delegate-in-c

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!