我在async 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
为什么没有捕获异常?我知道它是另一个线程,但它应该被外部的Try ... Catch块(Try Catch outside of: await Task.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字,它确实会抓住它!
我现在做错了什么?
谢谢
答案 0 :(得分:0)
您发布的原始代码没有问题 - 调试器只是在您的代码执行之前捕获异常,这是完全正常的。
使用更新的代码,问题是使用Async Sub
。无法直接从Async Sub
方法捕获异常。您应该使用(非Async
)Sub
或Async Func(of Task)
代替。这个原则在我的MSDN article on async best practices中称为“避免异步空白”。