From e85178e0c540869300369752713edfca07e13f3e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Mon, 28 Dec 2015 16:47:53 +0000 Subject: [PATCH] Unwrap TargetInvocationExceptions. Calling Delegate.DynamicInvoke wraps any exception - we want to expose the actual exception to callers. --- src/Perspex.Interactivity/RoutedEvent.cs | 11 ++++++++++- tests/Perspex.Controls.UnitTests/TopLevelTests.cs | 3 +-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Perspex.Interactivity/RoutedEvent.cs b/src/Perspex.Interactivity/RoutedEvent.cs index ca865f74d0..3fa8f9aaf5 100644 --- a/src/Perspex.Interactivity/RoutedEvent.cs +++ b/src/Perspex.Interactivity/RoutedEvent.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; using System.Reflection; +using System.Runtime.ExceptionServices; namespace Perspex.Interactivity { @@ -100,7 +101,15 @@ namespace Perspex.Interactivity ((e.Route == RoutingStrategies.Direct) || (e.Route & sub.Routes) != 0) && (!e.Handled || sub.AlsoIfHandled)) { - sub.Handler.DynamicInvoke(sender, e); + try + { + sub.Handler.DynamicInvoke(sender, e); + } + catch (TargetInvocationException ex) + { + // Unwrap the inner exception. + ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); + } } } } diff --git a/tests/Perspex.Controls.UnitTests/TopLevelTests.cs b/tests/Perspex.Controls.UnitTests/TopLevelTests.cs index 9e4e54608c..ea5ecca1f6 100644 --- a/tests/Perspex.Controls.UnitTests/TopLevelTests.cs +++ b/tests/Perspex.Controls.UnitTests/TopLevelTests.cs @@ -311,9 +311,8 @@ namespace Perspex.Controls.UnitTests target.Template = CreateTemplate(); target.Content = child; - target.ApplyTemplate(); - Assert.Throws(() => target.Presenter.ApplyTemplate()); + Assert.Throws(() => target.ApplyTemplate()); } }