James
James

Reputation: 356

Aggregating Event Exceptions

I'm following on with a tutorial detailing handling events thrown in multiple subscribers to an event. However when the code is run, the TargetInvocationException catch block isn't catching the exceptions thrown in the method body of the subscribers: throw new Exception("Hello") and throw new Exception("World") respectively.

Instead I get an unhandled exception error in the first listener, predictably at throw new Exception("Hello") in private static void AlarmListener.

What is it that I'm doing incorrectly when attempting to catch the invoked method's exceptions?

class AggregatingExceptions
{              
    public void Main()
    {
        //create the alarm
        AlarmAndLocation alarm = new AlarmAndLocation();

        //subscribe the listeners 
        alarm.OnAlarmRaised += AlarmListener;
        alarm.OnAlarmRaised += AlarmListener2;

        try
        {
            alarm.RaiseAlarm("Kitchen");
        }
        catch (AggregateException agg)
        {
            foreach (Exception ex in agg.InnerExceptions)
            {
                Console.WriteLine(ex.Message);
            }
        }
    }

    private static void AlarmListener(object sender, AlarmEventArgs e)
    {
        Console.WriteLine("Alarm listener 1 called.");
        throw new Exception("Hello");
    }
    private static void AlarmListener2(object sender, AlarmEventArgs e)
    {
        Console.WriteLine("Alarm listener 2 called.");
        throw new Exception("World");
    }

}

public class AlarmAndLocation
{
   public event EventHandler<AlarmEventArgs> OnAlarmRaised = delegate { };

   public List<Exception> exceptionList = new List<Exception>();

    public void RaiseAlarm(string location)
    {            
        foreach (Delegate handler in OnAlarmRaised.GetInvocationList())
        {
            try
            {
                handler.DynamicInvoke(this, new AlarmEventArgs(location));
            }
            catch (TargetInvocationException ex) 
            {
                exceptionList.Add(ex.InnerException);
            }
        }

        if(exceptionList.Count > 0)
        {
            throw new AggregateException(exceptionList);
        }
    }
}

public class AlarmEventArgs : EventArgs
{
    public string  Location { get; set; }

    public AlarmEventArgs(string location)
    {
        Location = location;
    }
}

Upvotes: 0

Views: 145

Answers (0)

Related Questions