У меня есть много проблем, чтобы поймать исключение в асинхронной 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», он его ловит!!!
Что я сейчас делаю не так?
Спасибо!
Не было никаких проблем с исходным кодом, который вы опубликовали — отладчик просто ловил исключение до того, как ваш код сделал, что совершенно нормально.
С обновленным кодом проблема заключается в использовании
Async Sub
. Исключения не могут быть непосредственно перехвачены изAsync Sub
методов. Вы должны использовать (неAsync
)Sub
ИлиAsync Func(of Task)
вместо. Этот принцип известен как» избежать асинхронного void » в моей статье MSDN об асинхронных рекомендациях .