0

This is a windows forms application in which I have a particular form. On this form I display the progress of some processing that is supposed to happen in the background asynchronously. All of it works great, except for when I try to handle exceptions that are caught within the background processing....

This is the sub in my form's code that calls the Async function, which is in a module containing all the background processing code:

Public Async Sub BasicProcessing()
        Try
            Dim processTarget As Action(Of Integer)
            processTarget = AddressOf UpdatePulseProcessing
            myProgress = New Progress(Of Integer)(processTarget)
            myCount.Vehicles = Await ProcessmyCountFile(myCount, myProgress)

            If OperationCanceledByUser = True Then
                Exit Sub
            End If
    Catch ex As Exception
        MessageBox.Show(Me, "Unable to update count." _
                        & Environment.NewLine & ex.Message, _
                        "Error updating count", MessageBoxButtons.OK, MessageBoxIcon.Error)
        Exit Sub
    End Try
End Sub

This is the async function that it calls, which is in a separate module:

Public Function ProcessmyCountFile(CountToProcess As Count, ByVal ProgressObject As IProgress(Of Integer)) As Task(Of List(Of Vehicle))
    myProgressObject = ProgressObject
    basicToken = New CancellationTokenSource

    Try
        Return CType(Task(Of List(Of Vehicle)).Run(Function()

                                                       If basicToken.IsCancellationRequested Then
                                                           Return Nothing
                                                           Exit Function
                                                       End If

                                                       myCountFile = CountToProcess
                                                       MyVehicles = New List(Of Vehicle)

                                                       'All that is important in here to note is a call to a regular sub within this module
                                                       CreateVehicles()

                                                       Return MyVehicles
                                                   End Function, basicToken.Token), Global.System.Threading.Tasks.Task(Of List(Of Global.STARneXt.Vehicle)))
    Catch ex As Exception
        Throw New Exception(ex.Message)
        Return Nothing
    End Try

End Function

Public Sub StopProcess()
    If Not basicToken Is Nothing Then
        basicToken.Cancel() ' We tell our token to cancel
    End If
End Sub

This is the regular sub called by the Async function:

Private Sub CreateVehicles()

    Try

        'In here are calls to other regular subs within the same module, let's just call them A and B

    Catch ex As Exception
        StopProcess()
        Throw New Exception("Error creating vehicles at pulse " & pulsePointer & ". " & ex.Message)
    End Try

End Sub

When I run this code with data that I know ends up generating an error in sub B, the error does propagate up, as far as up to the method that is directly called by the async function.... So when running in VS, it will stop at "Throw New Exception("Error creating vehicles at pulse " & pulsePointer & ". " & ex.Message)", with the Message containing the message thrown by sub B.

This is what the debugger says on that line:

An exception of type 'System.Exception' occurred in MyProject.exe but was not handled in user code. Additional information: Error creating vehicles at pulse....[error message propagated up as thrown by called subs]. Arithmetic operation resulted in an overflow.

Then strangely enough, within the debugger if I hit "Step Into", it does then return to the sub in my form that called the Async function, which shows the message box on the GUI.

So how do I get this to automatically return back up to the original form code to show the message box? Why does it stop where it stops without continuing to propagate?

FYI, I did find this question, but it ultimately did not help.

Community
  • 1
  • 1
Andy
  • 616
  • 11
  • 32
  • It's just a debugger quirk. You can tell VS not to break on that type of exception. – Stephen Cleary Aug 17 '16 at 02:42
  • @StephenCleary, but wouldn't that make it not break anytime it encounters an overflow exception? I don't want that, right? Are you saying that things ought to end up working as expected when I run it as an installed application as opposed to in the debugger? – Andy Aug 17 '16 at 13:35
  • 1
    Yes, it would probably work just fine outside the debugger. – Stephen Cleary Aug 17 '16 at 13:36

1 Answers1

0

@StephenCleary was right - I created a new install for my project as it is, and in the installed version I do get the message box with the expected error message.

Strange behavior on the part of the debugger, and a bit discouraging, but none-the-less I am glad that my code as laid out in my question does actually work.

Andy
  • 616
  • 11
  • 32