# Error Handling

# Try...Catch...Finally Statement


    'Your program will try to run the code in this block.  
    'If any exceptions are thrown, the code in the Catch Block will be executed,
    'without executing the lines after the one which caused the exception.
Catch ex As System.IO.IOException
    'If an exception occurs when processing the Try block, each Catch statement
    'is examined in textual order to determine which handles the exception. 
    'For example, this Catch block handles an IOException.
Catch ex As Exception
    'This catch block handles all Exception types.
    'Details of the exception, in this case, are in the "ex" variable.
    'You can show the error in a MessageBox with the below line.
    'A finally block is always executed, regardless of if an Exception occurred.
End Try

Example Code:

    Dim obj = Nothing
    Dim prop = obj.Name 'This line will throw a NullReferenceException

    Console.WriteLine("Test.") ' This line will NOT be executed
Catch ex As System.IO.IOException
    ' Code that reacts to IOException.
Catch ex As NullReferenceException
    ' Code that reacts to a NullReferenceException
    Console.WriteLine("NullReferenceException: " & ex.Message)
    Console.WriteLine("Stack Trace: " & ex.StackTrace)
Catch ex As Exception
    ' Code that reacts to any other exception.
    ' This will always be run, regardless of if an exception is thrown.
End Try

# Creating custom exception and throwing

You can create a custom exception and throw them during the execution of your function. As a general practice you should only throw an exception when your function could not achieve its defined functionality.

Private Function OpenDatabase(Byval Server as String, Byval User as String, Byval Pwd as String)
    if Server.trim="" then 
        Throw new Exception("Server Name cannot be blank")
    elseif User.trim ="" then 
        Throw new Exception("User name cannot be blank")
    elseif Pwd.trim="" then 
        Throw new Exception("Password cannot be blank")

    'Here add codes for connecting to the server
End function

# Try Catch in Database Operation

You can use Try..Catch to rollback database operation by placing the rollback statement at the Catch Segment.

        'Do the database operation...        
        xCmd.CommandText = "INSERT into ...."

    Catch ex As Exception 
        'Rollback action when something goes off           
    End Try

# The Un-catchable Exception

Although Catch ex As Exception claims that it can handle all exceptions - there are one exception (no pun intended).

Imports System
Static Sub StackOverflow() ' Again no pun intended
End Sub
Static Sub Main()
    Catch ex As Exception
        Console.WriteLine("Exception caught!")
        Console.WriteLine("Finally block")
    End Try
End Sub

Oops... There is an un-caught System.StackOverflowException while the console didn't even print out anything! According to MSDN (opens new window),

Starting with the .NET Framework 2.0, you can’t catch a StackOverflowException object with a try/catch block, and the corresponding process is terminated by default. Consequently, you should write your code to detect and prevent a stack overflow.

So, System.StackOverflowException is un-catchable. Beware of that!

# Critical Exceptions

Generally most of the exceptions are not that critical, but there are some really serious exceptions that you might not be capable to handle, such as the famous System.StackOverflowException. However, there are others that might get hidden by Catch ex As Exception, such as System.OutOfMemoryException, System.BadImageFormatException and System.InvalidProgramException. It is a good programming practice to leave these out if you cannot correctly handle them. To filter out these exceptions, we need a helper method:

Public Shared Function IsCritical(ex As Exception) As Boolean
    Return TypeOf ex Is OutOfMemoryException OrElse
           TypeOf ex Is AppDomainUnloadedException OrElse
           TypeOf ex Is AccessViolationException OrElse
           TypeOf ex Is BadImageFormatException OrElse
           TypeOf ex Is CannotUnloadAppDomainException OrElse
           TypeOf ex Is ExecutionEngineException OrElse ' Obsolete one, but better to include
           TypeOf ex Is InvalidProgramException OrElse
           TypeOf ex Is System.Threading.ThreadAbortException
End Function


Catch ex As Exception When Not IsCritical(ex)
    Console.WriteLine("Exception caught: " & ex.Message)
End Try