Exception Handling Statements (Throw, Try) |
Top Previous Next |
Throw statement
NativeVB provides true exceptions support through Try/Catch/Finally and Throw statements. The Throw statement can be used to throw exceptions, like this:
If X > 10 Then Throw New Exception("X is too big")
Note, that here New Exception(...) is just an expression that creates an instance of the exception. So, to really use the Throw statement, it is required to add imported VCL unit(s) to the script-control to allow script-code to use exception types (Exception in this case). Otherwise, you will get "Undeclared identifier" run-time error.
Try/Catch/Finally statement
Your program can use Try/Catch/Finally statement to catch raised exceptions and execute error handling code. The Try statement can contain one or more conditional Catch blocks, single unconditional Catch block and a single Finally block. Unconditional Catch block should reside after all conditional catches, and the Finally block should be the last block in a Try statement. All of these blocks are optional and can be omit; however, at least one block is required. Conditional Catch blocks will catch exceptions only of the specified class (or subclass of); unconditional Catch block will catch all exceptions. Note, that even empty unconditional Catch block catches all possible exceptions, however, if the unconditional Catch block is omit, then all not caught exceptions will be thrown away from the current Try statement.
Try DoSomething Catch MsgBox("Error has occurred.") End Try
Try DoSomething Catch E As EArgumentException MsgBox("Invalid argument") Catch E As EOutOfMemory MsgBox("Out of memory") Catch MsgBox("Other error") End Try
The variable, specified in a Catch block becomes accessible within the block and holds the reference to the current exception instance:
Try DoSomething Catch E As EArgumentException LogMessage("Error: " & E.Message) End Try
Normally, if the exception is caught by Catch handler, it will not be re-raised implicitly to parent statements. If you need to re-raise the exception, you can use the Throw statement without arguments:
Try DoSomething Catch MsgBox("Error") Throw End Try
This form of the Throw statement is only allowed inside Catch handler. The run-time error will occurs otherwise.
Script code can use the Finally block to guarantee execution of the finalization code in both cases: when error occurred and when it is not:
Dim obj = New TMyObject
The obj instance, created in above example will be freed in any case, even if DoSomething will raise an exception. Finally block does not catch the exception, so it will be implicitly re-raiseed away from the current Try statement.
If Exit [Sub/Function/For/Do] statements are used inside the Try statement and leads outside of the Try, the Finally statements will be also executed:
For i = 0 To 10 Try Exit For Finally MsgBox("In finally") End Try Next
It is illegal to use Exit [Sub/Function/For/Do] statements inside the Finally block itself; run-time error will be raised:
For i = 0 To 10 Try DoSomething Finally Exit For 'Illegal! End Try Next |