2016-12-28 161 views
0

我有很多麻煩,以異步DelegateCommand(棱鏡5)捕獲異常。異常處理棱鏡異步DelegateCommand

在視圖模型的構造:

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

在視圖模型:

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(())捕捉。

enter image description here

注:這是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」中的異步詞,它確實會抓住它!

我現在做錯了什麼?

謝謝

+0

您確定*此代碼*不會捕獲異常嗎? –

+0

我絕對確定我生命中的東西很少:)但是我粘貼並複製了代碼,檢查了它,並沒有發現異常。我正在用圖片更新問題 –

+1

看起來你在調試器中打開了第一次機會異常。如果你從那裏F5,它會被抓住? –

回答

0

有與您發佈的原代碼沒問題 - 調試器剛剛捕獲異常之前,你的代碼一樣,這是完全正常的。

隨着更新的代碼,問題是使用Async Sub。例外情況不能直接從Async Sub方法中捕獲。您應該使用(非AsyncSubAsync Func(of Task)。這個原理在我的MSDN article on async best practices中被稱爲「避免異步無效」。

+0

我做錯了什麼,因爲我不明白。如果我將signture更改爲「Private Async Function OnModificarPedido(arg As Object)As Task」,那麼在構造函數「cmdModificarPedido = New DelegateCommand(Of Object)(AddressOf OnModificarPedido,AddressOf CanModificarPedido)」中的代碼如何?它會顯示以下消息:「從此異步函數返回的任務將被刪除,並且忽略它中的任何異常。請考慮將其更改爲Async Sub,以便它的異常被傳播」,並且該異常也不會被捕獲。非常感謝 –

+1

錯誤的方法。你應該改變'throwMyException',而不是'OnModificarPedido'。 –

+0

你是天才!這正是問題!沒有async Sub解決了我的問題(我無法使它與Async Func(任務)一起工作)。謝謝 –