Обработка исключений в async DelegateCommand Prism

У меня есть много проблем, чтобы поймать исключение в асинхронной DelegateCommand (Prism 5).

В конструкторе ViewModel:

cmdModificarPedido = New DelegateCommand(Of Object)(AddressOf OnModificarPedido, AddressOf CanModificarPedido)

В ViewModel:

Private _cmdModificarPedido As DelegateCommand(Of Object)
Public Property cmdModificarPedido As DelegateCommand(Of Object)
    Get
        Return _cmdModificarPedido
    End Get
    Private Set(value As DelegateCommand(Of Object))
        SetProperty(_cmdModificarPedido, value)
    End Set
End Property
Private Function CanModificarPedido(arg As Object) As Boolean
    Return True
End Function
Private Async Sub OnModificarPedido(arg As Object)
    Try
        Await Task.Run(Sub()
                           Throw New Exception("My Exception")
                       End Sub)
        NotificationRequest.Raise(New Notification() With {
                       .Title = "OK",
                       .Content = "Command OK"
                   })

    Catch ex As Exception
        NotificationRequest.Raise(New Notification() With {
                    .Title = "Error",
                    .Content = ex.Message
                })

    End Try
End Sub

Почему исключение не улавливается? Я знаю, что это другая нить, но она должна быть поймана в любом случае внешней попыткой…Catch block (попробуйте поймать вне: ожидание задачи.Run(()).

Введите описание изображения здесь

Примечание: это vb.net код, но решение на C# тоже подойдет.

Обновление 2
Как только я узнаю, что возникла проблема с конфигурацией отладчика( исключения первого шанса), я напишу более реалистичный пример с той же проблемой:

Private Async Sub OnModificarPedido(arg As Object)
    Try
        Await Task.Run(Sub()
                           Try
                               throwMyException()
                           Catch ex As Exception
                               Throw New Exception(ex.Message)
                           End Try
                       End Sub)
        NotificationRequest.Raise(New Notification() With {
                       .Title = "Pedido Modificado",
                       .Content = "Pedido " + pedido.numero.ToString + " modificado correctamente"
                   })

    Catch ex As Exception
        NotificationRequest.Raise(New Notification() With {
                    .Title = "Error",
                    .Content = ex.Message
                })

    End Try
End Sub
Public Async Sub throwMyException()
    Throw New Exception("My Exception")
End Sub

И теперь он не ловит исключение, когда я нажимаю F5. Он ломается в » throwMyException ()», он не ловит исключение, хотя оно вызывается внутри блока try Catch.

Важно: если я удаляю асинхронное слово в «throwMyException», он его ловит!!!

Что я сейчас делаю не так?

Спасибо!

1 ответ

  1. Не было никаких проблем с исходным кодом, который вы опубликовали — отладчик просто ловил исключение до того, как ваш код сделал, что совершенно нормально.

    С обновленным кодом проблема заключается в использовании Async Sub. Исключения не могут быть непосредственно перехвачены из Async Subметодов. Вы должны использовать (неAsync) SubИли Async Func(of Task)вместо. Этот принцип известен как» избежать асинхронного void » в моей статье MSDN об асинхронных рекомендациях .