问题
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