0

イベントへの複数のサブスクライバーでスローされたイベントの処理について詳しく説明するチュートリアルを続けています。ただし、コードが実行されると、TargetInvocationExceptioncatch ブロックはサブスクライバーのメソッド本体でスローされた例外をキャッチしていませthrow new Exception("Hello")throw new Exception("World")

throw new Exception("Hello")代わりに、最初のリスナーで、予想どおりinで未処理の例外エラーが発生しますprivate static void AlarmListener

呼び出されたメソッドの例外をキャッチしようとするときに間違っているのは何ですか?

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

0 に答える 0