Exceptions are special in that when one is thrown, the .NET runtime will go up the function call-stack until it finds a catch block that can handle the exception. What this means is that you can put a try-catch at the "root" function (the one that calls all the other functions) and any exceptions thrown by any lower functions will be caught in the root function's catch block. Here's an example:
Sub Main()
Try
DoStuff1()
Catch ex As Exception
' Handle exception
End Try
End Sub
Private Sub DoStuff1()
DoStuff2()
End Sub
Private Sub DoStuff2()
DoStuff3()
End Sub
Private Sub DoStuff3()
' Generate an exception
End Sub
If DoStuff3 generates an exception, .NET will jump to the catch block in Main. This way you can assume that all the values returned from your functions will be correct since if there was an error in the function, .NET would jump to the outer catch block, skipping any code that used the return value.