vb.netexceptiontry-catchstructured-exception

Catch, Handle, then Rethrow Exception?


I ran into an interesting dilemma today. I have a function that handles information and checks for duplicate values, then returns the next number that is not a duplicate. So, I have something like this:

Public Function GetNextNonDuplicateNumber(NumberToCheck as Long) as Long

      //the non-duplicate the function will return
      Dim NonDuplicate as Long

      If CheckForDuplicate(NumberToCheck) = True Then
          Throw New DuplicateException()
      Else
          NonDuplicate = NumberToCheck
      End If

End Function

Then at the bottom of the function I have a catch block that handles the duplicate by incrementing until I don't have a duplicate any more, like this:

Catch ex as DuplicateException
   NonDuplicate = IncrementToNonDuplicateValue(NumberToCheck)
   Throw ex
   Return NonDuplicate
End Function

As you can see, I want to handle the exception specifically, but I also want to throw it when I'm done because I want to alert other code outside the function.

The problem is that simply throwing it exits out of the function with a null value. Am I thinking about a try/catch the wrong way, or is there a way around this?


Solution

  • If you caught an exception and recovered from it (with your IncrementToNonDuplicate...) then there is no reason to throw an exception anymore. Code between catch and end try should just clean the resources like closing a file or datareader if you will rethrow it.

    You could rather return a structure that contains NonDuplicate value and required information about errors in function. Other way would be to throw a custom exception that will contain information like "Invalid number: it should be...)