梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
Public Sub CalledMethod�┌�
Me。depth = 1
Try
CalledCalledMethod�┌�
Finally
Me。depth = 1
End Try
End Sub
Public Sub Method�┌�
Me。depth = 0
Try
CalledMethod�┌�
Finally
Me。depth = 0
End Try
End Sub
Public Function GetDepth�┌� As Integer
Return Me。depth
End Function
End Class
Class Tests
Sub TestCallingExample�┌�
Dim cls As CallingExample = Nothing
Try
cls = new CallingExample�┌�
cls。Method�┌�
Catch exception1 As Exception
End Try
Console。WriteLine�─�Depth is �──�& cls。GetDepth�┌� & ;��;��
End Sub
Public Sub RunAll�┌�
TestCallingExample�┌�
End Sub
End Class
In this example�察�each Finally keyword is associated with a Try block。 You don¨t need to
associate a Catch block with a Try block if you are using Finally。 If the Try block is entered�察 �
when the code leaves the Try block�察�regardless of whether it ran successfully or threw an excep
tion�察�the code within Finally is executed。 Thus�察�if stack unwinding occurs�察�it is possible to reset
or assign state to a consistent value before the exception is processed elsewhere。
*Note When the Finally block is called�察�you don¨t know if it is called due to an exception or successful
code execution。 Thus�察�you shouldn¨t assume that Finally is called because an exception was thrown。
´´´´´´´´´´´´´´´´´´´´´´Page 148´´´´´´´´´´´´´´´´´´´´´´´
126 CH AP T E R 5 * L E A R N IN G AB OU T V I SU A L B AS IC E X C E P TI ON H AN D L IN G
Sandboxing Your Code
The sandboxing technique is similar to playing with an Etch A Sketch�察�in that you attempt to
build a state�察�and if you make a mistake�察�you can throw the state away。 This requires that you
separate your code into three distinct steps�此�declaration�察�manipulation�察�and integration。 Figure 5´7
illustrates the three steps in sandboxing your code。
1。 Declaration�此�Each variable is
declared and assigned a default state
Function Separated�┌� As SeparateSteps that will not generate an exception
Dim cls As SeparateSteps = Nothing
cls = New SeparateSteps�┌� 2。 Manipulation�此�Each variable is manipulated
cls。PossibleExceptionMethod�┌�
using methods to create a state that does not
Return cls alter anything outside the method。 The variables
End Function may reference the global state�察�but not change it。
3。 Integration�此�Once the state has
been modified�察�an integration into the
bigger system can occur
Figure 5´7。 Sandboxing your code
Figure 5´7 illustrates one way of performing a sandboxing operation�察�but there are many
other possible implementations。 In each of the different implementations�察�the objective is the
same�此�you want to perform the operations that could cause an exception apart from the main
code。 Then if you do have an exception�察�it will be localized to the separate code。 When the stack
unwinds�察�the other code won¨t be corrupted。
*Note The rule of thumb with sandboxing your code is to keep all of the code manipulations that could
generate an exception separate from any existing state that could be corrupted。 Once the manipulations have
been carried out�察�you integrate the objects into the global state using method calls that are extremely unlikely
to generate exceptions。 For those situations when you must manipulate existing state�察�use a Finally handler�察 �
so that the previous existing state can be re´created if necessary。
Filtering Exceptions
In all of the examples presented so far in this chapter�察�the Catch statement used the Exception type�此�
Catch exception1 As Exception
Exception will catch every exception。
´´´´´´´´´´´´´´´´´´´´´´Page 149´´´´´´´´´´´´´´´´´´´´´´´
CH AP T E R 5 * L E AR N IN G AB O U T V I SU A L B AS IC E X CE PT I ON HA N D L IN G 127
In Figure 5´3�察�the IDE caught an exception�察�referencing NullReferenceException�察�which is
a specific type of exception。 When you use it in a Catch statement�察�you will catch only null refer
ence exceptions。
By specializing the exception�察�you have the ability to filter which exception you want to
catch。 For example�察�NotSupportedException will catch only instances of NotSupportedException
exceptions。 Here is an example�此�
Try
Throw New NotSupportedException�─�There is no code;��
Catch ex As NotSupportedException
End Try
If the code within the Try block threw an instance of Exception�察�the Catch block would not
trigger�察�because the Catch block was looking for a specific exception type。
Exception types can be bined to provide specific filtering capabilities。 The specific
exception type should be the first exception after the Try block�察�as in this example�此�
Try
' 。 。 。
Catch ex1 As NotSupportedException
'
Catch ex2 As Exception
'
End Try
By bining multiple exception filters�察�you don¨t need to figure out which kind of excep
tion is being thrown。 For example�察�without the filtering capabilities of a Catch block to catch
NotSupportedException exception types�察�you would need to write this code�此�
Try
Throw New NotSupportedException�─�There is no code;��
Catch ex As Exception
If ex Is NotSupportedException Then
'。 。 。
Else
Throw ex
End If
End Try
Table 5´1 lists mon exception types in the System namespace that you can throw or
can be thrown。 There are many more exceptions�察�and you can even generate your own excep
tions by subclassing Exception。
´´´´´´´´´´´´´´´´´´´´´´Page 150´´´´´´´´´´´´´´´´´´´´´´´
128 CH AP T E R 5 * L E A R N IN G AB OU T V I SU A L B AS IC E X C E P TI ON H AN D L IN G
Table 5´1。 mon Exception Types
Exception Description
Exception Plain´vanilla exception�察�a general container for all exceptions。
When you get one of these exceptions�察�look at the Message
property for the exact details。 If you throw this type of excep
tion�察�it is important to supply an easy´to´understand string to
the exception constructor。
ArgumentException Thrown if you call a method and one of the arguments is not
valid。 Typically�察�in the Message property you can find the
problem with the arguments。 If this exception is thrown�察�it is
because the contents of the argument are wrong。
ArgumentNullException Thrown if you call a method where one of the arguments is