8.2.3
Класове на изключенията - Exception classes
Системното пространство от имена (System namespace) съдържа класа Exception, който е базов клас за съществени колекции на
произхождащите класове (списъкът следва). Забележете, че идентификациите индицират наследяемостта.
EntryPointNotFoundException (петата отзад напред) наследява от TypeLoadException.
Exception
ApplicationException
SystemException
AccessException
FieldAccessException
MethodAccessException
MissingMemberException
MissingFieldException
MissingMethodException
AppDomainUnloadedException
AppDomainUnloadInProgressException
ArgumentException
ArgumentNullException
ArgumentOutOfRangeException
DuplicateWaitObjectException
ArithmeticException
DivideByZeroException
NotFiniteNumberException
OverflowException
ArrayTypeMismatchException
BadImageFormatException
CannotUnloadAppDomainException
ContextMarshalException
CoreException
ExecutionEngineException
IndexOutOfRangeException
StackOverflowException
ExecutionEngineException
FormatException
InvalidCastException
InvalidOperationException
MulticastNotSupportedException
NotImplementedException
NotSupportedException
PlatformNotSupportedException
NullReferenceException
OutOfMemoryException
RankException
ServicedComponentException
TypeInitializationException
TypeLoadException
EntryPointNotFoundException
TypeUnloadedException
UnauthorizedAccessException
WeakReferenceException
URIFormatException
Името на класа различава един тип
грешка (exception) от друг. Свойствата
и методите на exception обекта се наследяват от базовия
клас Exception.
Когато пишем Catch блокове, винаги пред нас стои въпроса дали да впримчим родовия exception клас:
Sub
test( )
Try
...
Catch
e As Exception
...
End
Try
End
Sub
или специфични exception класове. Разбира се, момента
да впримчим специфичен exception клас
е когато искаме да обработим грешки различно базирани от техния клас. Има
случаи, когато може да искаме да използваме предимствата на членове на отделен exception клас, който не е изпълнен в Exception base class. Например ArgumentException
класа има свойство ParamName което връща името на параметъра, който указва
грешката .
Сега, ако просто впримчваме родовия Exception class, както в кода:
Sub
test( )
Try
Dim
s, d As String
s
= "c:temp.txt"
' опит за копиране на
файла в невалиден път
FileCopy(s,
d)
Catch
e As Exception
MsgBox(e.Message)
End
Try
End
Sub
тогава не можем да използваме
предимството на свойство ParamName. От друга страна, ако впримчим класа ArgumentException, като в кода:
Sub
test1( )
Try
Dim
s, d As String
s
= "c:temp.txt"
' опит за копиране на
файла в невалидна цел
FileCopy(s,
d)
Catch
e As ArgumentException
MsgBox(e.Message
& " Parameter: " & e.ParamName)
End
Try
End
Sub
тогава можем да получим името на
параметъра .
Поглед върху членовете на класа Exception:
Message
property-Стринг, съдържащ съобщението за
грешка.
Source
property-Стринг, който описва апликацията
или обекта причинили грешката.
StackTrace
property-Стринг, който съдържа трасето на
стека назабавно преди да се появи грешката.
TargetSite
property-Стринг, който дава метода, който
дава грешката.
ToString
method-Стринг, който връща пълното име
на грешката, вероятно съобщение за грешка, името на вътрешната грешка и трасето на стека . Синтаксис:
ToString(
)
Представете си, че следния код се
състои от три подпрограми . Първата, Exception0, съдържа инструкция Try...Catch.... В блока Try, подпрограма Exception0 вика подпрограма
Exception1, която вика подпрограма Exception2.
Sub
Exception0( )
Dim
s As String
Try
Exception1(
)
Catch
e As Exception
s
= "Message: " & e.Message
s
= s & ControlChars.CrLf & "Source: " & e.Source
s
= s & ControlChars.CrLf & "Stack: " & e.StackTrace
s
= s & ControlChars.CrLf & "Target: " & e.TargetSite.Name
s
= s & ControlChars.CrLf & "ToString: " & e.ToString
debug.writeline(s)
End
Try
End
Sub
Sub
Exception1( )
Exception2(
)
End
Sub
Sub
Exception2( )
Throw
New ArgumentNullException( )
End
Sub
В Exception2, има един ред
от код, който изпълнява инструкция Throw, която "хвърля" грешката. Това е подобно на предизвикване на грешка с метод
Err.Raise. Даже, както може да видите при ключова
дума New, инструкция Throw всъщност създава обект от един от типовете exception.
Изходът от викането на Exception0 e:
Message:
argument can't be null
Source:
Stack:
at WindowsApplication3.Form1.Exception2( )
in
C:VBNETForm1.vb:line 68
at
WindowsApplication3.Form1.Exception1( )
in
C:VBNETForm1.vb:line 66
at
WindowsApplication3.Form1.Exception0( )
in
C:VBNETForm1.vb:line 53
Target:
Exception2
ToString:
System.ArgumentNullException: argument can't be null
at
WindowsApplication3.Form1.Exception2( )
in
C:VBNETForm1.vb:line 68
at
WindowsApplication3.Form1.Exception1( )
in
C:VBNETForm1.vb:line 66
at
WindowsApplication3.Form1.Exception0( )
in
C:VBNETForm1.vb:line
53