diff --git a/src/Prism.Core/Commands/AsyncDelegateCommand.cs b/src/Prism.Core/Commands/AsyncDelegateCommand.cs index e748ad40d8..8c7eec460f 100644 --- a/src/Prism.Core/Commands/AsyncDelegateCommand.cs +++ b/src/Prism.Core/Commands/AsyncDelegateCommand.cs @@ -98,10 +98,6 @@ public async Task Execute(CancellationToken? cancellationToken = null) await _executeMethod(token) .ConfigureAwait(false); } - catch (TaskCanceledException) when (token.IsCancellationRequested) - { - // Do nothing... the Task was cancelled - } catch (Exception ex) { if (!ExceptionHandler.CanHandle(ex)) @@ -145,23 +141,11 @@ public bool CanExecute() /// Command Parameter protected override async void Execute(object? parameter) { + // We don't want to wrap this in a try/catch because we already handle + // or mean to rethrow the exception in the call with the CancellationToken. var cancellationToken = _getCancellationToken(); - try - { - await Execute(cancellationToken) - .ConfigureAwait(false); - } - catch (TaskCanceledException) when (cancellationToken.IsCancellationRequested) - { - // Do nothing... the Task was cancelled - } - catch (Exception ex) - { - if (!ExceptionHandler.CanHandle(ex)) - throw; - - ExceptionHandler.Handle(ex, parameter); - } + await Execute(cancellationToken) + .ConfigureAwait(false); } /// diff --git a/src/Prism.Core/Commands/AsyncDelegateCommand{T}.cs b/src/Prism.Core/Commands/AsyncDelegateCommand{T}.cs index 4ed68524da..a449f5c67b 100644 --- a/src/Prism.Core/Commands/AsyncDelegateCommand{T}.cs +++ b/src/Prism.Core/Commands/AsyncDelegateCommand{T}.cs @@ -101,10 +101,6 @@ public async Task Execute(T parameter, CancellationToken? cancellationToken = nu await _executeMethod(parameter, token) .ConfigureAwait(false); } - catch (TaskCanceledException) when (token.IsCancellationRequested) - { - // Do nothing... the Task was cancelled - } catch (Exception ex) { if (!ExceptionHandler.CanHandle(ex)) @@ -149,14 +145,10 @@ public bool CanExecute(T parameter) protected override async void Execute(object? parameter) { var cancellationToken = _getCancellationToken(); + T parameterAsT; try { - await Execute((T)parameter!, cancellationToken) - .ConfigureAwait(false); - } - catch (TaskCanceledException) when (cancellationToken.IsCancellationRequested) - { - // Do nothing... the Task was cancelled + parameterAsT = (T)parameter!; } catch (Exception ex) { @@ -164,7 +156,14 @@ await Execute((T)parameter!, cancellationToken) throw; ExceptionHandler.Handle(ex, parameter); + return; } + + // If we had an exception casting the parameter to T , + // we would have already returned. We want to surface any + // exceptions thrown by the Execute method. + await Execute(parameterAsT, cancellationToken) + .ConfigureAwait(false); } ///