Title: Pag.1
1Hoofdstuk 8 Fout afhandeling
- Inleiding
- Structured Exception Handling
- Hoe fouten opvangen
- Geen foutafhandeling
- Alle fouten opvangen
- Specifieke fouten opvangen
- Throw exceptions
- Finally block
- Programmer-Defined Exception Classes
28.1 Inleiding
- Exception
- Indicatie van een onverwacht probleem at run-time
- Zonder foutafafhandeling wordt programma
afgesloten met een run-time error. - Waarom aan foutafhandeling bij run-time errors
doen? - Als je niet wilt dat het programma met een
foutmelding wordt afgesloten - een aantal alternatieve acties uitvoeren
- Je kan eventueel toch verder gaan met de
uitvoering van het programma - of als een andere dan de standaardfoutmelding
moet verschijnen
38.2 Exception Handling Overview
- VB.NET gebruikt structured exception handling
- Syntax foutafhandeling (error handling) bij
exceptions - ...
- Try
- bevat de code die moet worden uitgeprobeerd, en
die een fout kan veroorzaken - Catch
- reageren op de uitzonderingen die kunnen
voorkomen in Try-blok - Geparametriseerd vangt specifiek exceptions op
- Niet geparametriseerd vangt alle exceptions op
- Finally
- optioneel blok indien catch blokken bestaan
- bevat code die altijd moet worden uigevoerd,
ongeacht welke uitzondering plaatsvindt - End Try
- ...
48.2 Exception Handling Overview
- I.g.v. exception (throw point)
- Wordt opgevangen door een exception handler (in
aanroepketen) - Fout wordt afgehandeld
- In het andere geval (geen bijhorende exception
handler) - Debug mode
- Ignore ga verder met continue execution
- Break View in debugger
- Standard execution mode
- Continue ga verder met uitvoering
- Quit Beëindig programma
58.2 Exception Handling Overview
- Generatie van fout
- Voorbeeld openen bestand en lengte bepalen
- Dim lngSize as Long
- Dim s as FileStream
- sFile.open(txtFileName.text, FileMode.Open)
- lngSize s.Length
- s.Close()
- Wat kan er allemaal misgaan?
- File bestaat niet
- Pad bestaat niet
- Drive is niet beschikbaar(netwerkdrive bvb)
- Je hebt geen rechten om file te openen
- ...
68.3 Afhandelen van fouten
- Geen foutafhandeling
- Runtime vangt fout op en geeft melding aan de
gebruiker
78.3 Afhandelen van fouten
- Afhandelen van alle fouten (1 exceptionhandler)
- Geven van melding als een fout zich heeft
voorgedaan - Try
- sFile.open(txtFileName.text, FileMode.Open)
- lngSize s.Length
- s.Close()
- Catch
- Messagebox.Show(Fout by openen bestand)
- End Try
88.3 Afhandelen van fouten
- Wat als je wat meer uitleg wenst te geven over de
fout - De Exception klasse in de System namespace bevat
info over de runtime error - Declareer een variabele van het type Exception
- Try
- code die een uitzondering kan triggeren
- Catch ex As Exception
- Behandel uitzondering, gebruik makend van e
- End Try
- Of
- Dim ex As Exception
- Try
- code die een uitzondering kan triggeren
- Catch ex
- Behandel uitzondering, gebruik makend van e
- End Try
98.3 Afhandelen van fouten
- Meer info over fout opvragen adhv
System.Exception properties - Message foutmelding gekoppeld aan uitzondering
- Default boodschap geassocieerd met exception
type - Gecustomiseerde boodschap doorgegeven aan
constructor van object - Source naam van applicatie of object die fout
veroorzaakt heeft - TargetSite naam methode die fout gegenereerd
heeft - StackTrace exception historiek.1 string die een
sekwentiële lijst van methodes bevat, die op
moment dat de exception zich voordoet, nog niet
volledig zijn uitgevoerd - InnerException voor geneste exceptions
- HelpLink link naar Help file geassocieerd met
fout - ToString retourneert een string met de naam van
de exception, de exception message, de naam van
de inner exception en de stack.
108.3 Afhandelen van fouten
- Voorbeeld
- Try
- sFile.open(txtFileName.text, FileMode.Open)
- lngSize s.Length
- s.Close()
- Catch e As exception
- Messagebox.Show(Fout bij openen bestand
e.message) - Messagebox.Show(Fout bij openen bestand
e.tostring()) - End Try
118.3 Afhandelen van fouten
- Afhandelen van specifieke fouten(meerdere
exceptionhandlers) - .NET bevat tal van voorgedefinieerde exception
klassen die afgeleid zijn van de basis klasse
Exception in de System Namespace - In foutafhandeling kan je meerdere catch blokken
voorzien, die elk een specifieke fout afhandelen - Volgorde van catch blokken is belangrijk! Runtime
gaat op zoek naar eerste catch blok met een type
fout waarvoor de is een regel geldt.
128.3 Afhandelen van fouten
- Welke exceptions afhandelen?
- Zoek op in help Elke methode die exceptions
throwt heeft een sectie exceptions die de
mogelijke exceptions beschrijft - Voorbeeld Exceptionklassen igv openen file
- SecurityException gebruiker heeft niet de
vereiste permissies - ArgumentException path is leeg, bevat enkel
blancos of bevat illegale characters - FileNotFoundException bestand bestaat niet
- ArgumentNullException path of mode is een NULL
verwijzing - UnauthorizedAccessException file is read-only
of file is een pad - DirectoryNotFoundException directory niet
gevonden
138.3 Afhandelen van fouten
- Code
- Private Sub btnSpecifiekeFouten_Click(ByVal
sender As System.Object, ByVal e As
System.EventArgs) Handles btnSpecifiekeFouten.Clic
k - Dim lngSize As Long Dim s As FileStream
- Try
- s File.Open(txtFileName.Text,
FileMode.Open) - lngSize s.Length
- s.Close()
- Catch ArgumentExceptionParameter As
ArgumentException - MessageBox.Show("You specified an
invalid filename. ) - Catch FileNotFoundExceptionParameter As
FileNotFoundException - MessageBox.Show("The file you
specified can't be found. Please try again.") - Catch ArgumentNullExceptionParameter As
ArgumentNullException - MessageBox.Show("You passed in a Null
argument.") - Catch UnauthorizedAccessExceptionParameter
As UnauthorizedAccessException - MessageBox.Show( "You specified a
folder name, not a file name.") - Catch DirectoryNotFoundExceptionParameter
As DirectoryNotFoundException - MessageBox.Show("You specified a
folder that doesn't exist or can't be found.") - Catch SecurityExceptionParameter As
SecurityException - MessageBox.Show("You don't have
sufficient rights to open the selected file.")
148.3 Afhandelen van fouten
- .NET Exception hierarchy
- System.Exception
- Basis class van .NET Framework exception
hierarchy - Daaronder
- SystemException
- Basisklasse voor alle exceptions gegenereerd door
runtime - ApplicationException
- Creatie van exception data types eigen aan
applicatie - Kunnen geworpen worden door applicatie
- In de help kan je de verdere exception hierarchy
bekijken
158.3 Afhandelen van fouten
- Raisen van fout
- Fout laten afhandelen door aanroepende methode(s)
- Eigen fout definiëren
- Dmv. Throw laten optreden van een uitzondering
in procedure die dan wordt opgevangen door
dichtsbijzijnde uitzonderinghandler in
aanroepketen - Throw de fout die zich zojuist heeft voorgedaan
- Catch e As Exception
- Throw()
- Throw een fout ergens in de code binnen een Try
blok - Throw New FileNotFoundException()
- Een fout throwen een specifieke boodschap
meegeven - Throw New FileNotFoundException(Kan bestand
txtFileName.Text _ - niet openen)
- Throw New Exception(File not found)
-
168.3 Afhandelen van fouten
- Hoe gaat runtime op zoek naar handlers indien je
werkt met geneste Try blokken ? - Bij fout wordt de uitvoering van code
onmiddellijk afgebroken - De runtime gaat op zoek naar fouthandler in
bijhorend catch blokken. Als bijhorende handler
gevonden wordt, wordt fout afgehandeld en wordt
verdergegaan met uitvoering van programma - Als er geen geschikte handler is voor fout in de
bijhorende catch blokken, dan wordt de verwerking
van de omvattende methodes (try blokken)
afgebroken tot een corresponderende handler
gevonden - Als er geen omvattende try blokken zijn met een
passende handler, dan handelt de runtime zelf de
fout af met een runtime error
171 ' Properties.vb 2 ' Stack unwinding and
Exception class properties. 3 4 '
demonstrates using properties Message, StackTrace
and 5 ' InnerException 6 Class
CProperties 7 8 Shared Sub Main() 9
10 ' call Method1 any Exception
generatesd will be caught 11 ' in the
Catch block that follows 12 Try 13
Method1() 14 15 ' Output String
representation of Exception, then output 16
' values of properties InnerException, Message
and StackTrace 17 Catch exception As
Exception 18 Console.WriteLine("excepti
on.ToString " _ 19 vbCrLf
"0" vbCrLf, exception.ToString()) 20 21
Console.WriteLine("exception.Message "
_ 22 vbCrLf "0" vbCrLf,
exception.Message) 23 24
Console.WriteLine("exception.StackTrace " _ 25
vbCrLf "0" vbCrLf,
exception.StackTrace) 26 27
Console.WriteLine("exception.InnerException "
_ 28 vbCrLf "0" vbCrLf,
exception.InnerException) 29 30 End
Try 31 32 End Sub ' Main 33
1834 ' calls Method2 35 Public Shared Sub
Method1() 36 Method2() 37 End Sub 38
39 ' calls Method3 40 Public Shared
Sub Method2() 41 Method3() 42 End
Sub 43 44 ' throws an Exception
containing InnerException 45 Public Shared
Sub Method3() 46 47 ' attempt to
convert String to Integer 48 Try 49
Convert.ToInt32("Not an integer") 50 51
' wrap FormatException in new Exception 52
Catch formatException As
FormatException 53 54 Throw New
Exception("Exception occurred in Method3", _ 55
formatException) 56 57 End
Try 58 59 End Sub ' Method3 60 61
End Class ' CProperties
exception.ToString System.Exception Exception
occurred in Method3 ---gt System.FormatException
Input String was not in a correct format. at
System.Number.ParseInt32(String s, NumberStyles
style, NumberFormatInfo info)
19at System.Int32.Parse(String s, NumberStyles
style, IFormatProvider provider) at
System.Int32.Parse(String s) at
System.Convert.ToInt32(String value) at
Properties.CProperties.Method3() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 49 --- End of inner exception
stack trace --- at Properties.CProperties.Metho
d3() in C\books\2001\vbhtp2\ch11\Fig11_03\Propert
ies\Properties.vbline 54 at
Properties.CProperties.Method2() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 41 at Properties.CProperties.Met
hod1() in C\books\2001\vbhtp2\ch11\Fig11_03\Prope
rties\Properties.vbline 36 at
Properties.CProperties.Main() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 13 exception.Message Exception
occurred in Method3 exception.StackTrace at
Properties.CProperties.Method3() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 54 at Properties.CProperties.Met
hod2() in C\books\2001\vbhtp2\ch11\Fig11_03\Prope
rties\Properties.vbline 41 at
Properties.CProperties.Method1() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 36 at Properties.CProperties.Mai
n() in C\books\2001\vbhtp2\ch11\Fig11_03\Properti
es\Properties.vbline 13 exception.InnerException
System.FormatException Input String was not in
a correct format. at System.Number.ParseInt32(S
tring s, NumberStyles style, NumberFormatInfo
info) at System.Int32.Parse(String s,
NumberStyles style, IFormatProvider provider)
at System.Int32.Parse(String s) at
System.Convert.ToInt32(String value) at
Properties.CProperties.Method3() in
C\books\2001\vbhtp2\ch11\Fig11_03\Properties\Prop
erties.vbline 49
208.4 Finally block
- Bevat code die altijd wordt uitgevoerd
- Ongeacht het feit of er zich nu een uitzondering
voordoet of niet - Wordt uitgevoerd na de exception handling code en
voordat de controle wordt teruggegeven aan
aanroepende methode - Optionieel
- Niet vereist indien 1 of meerdere catch handlers
bestaan - Gebruik?
- Vrijgeven van resources gebruikt in Try Block
- Eliminatie van resource leaks
218.5 Programmer defined Exception Classes
- Erven van de klasse ApplicationException in
namespace System - Moeten voldoen aan volgende standaard
- Klasse naam moet eindigen op Exception
- Klasse moet 3 exceptions bevatten
- Default constructor
- Constructor met 1 input parameter van het type
String argument - De foutmelding
- Constructor met een String argument en een
Exception argument - De foutmelding
- Het InnerException object
228.5 Programmer defined Exception Classes
- Voorbeeld van user defined klasse
- Public Class FileTooLargeException
- Inherits ApplicationException
- Private mlngFileSize As Long
- Public Sub New(ByVal Message As String)
- MyBase.New(Message)
- End Sub
- Public Sub New(ByVal Message As String, ByVal
Inner As Exception) - MyBase.New(Message, Inner)
- End Sub
- Public Sub New(ByVal Message As String, ByVal
Inner As Exception, ByVal FileSize As Long) - MyBase.New(Message, Inner)
- mlngFileSize FileSize
- End Sub
- Public ReadOnly Property FileSize() As Long
238.5 Programmer defined Exception Classes
- Voorbeeld throwen van user defined exception
- Public Class FileTooLargeException
- Inherits ApplicationException
- Private mlngFileSize As Long
- Public Sub New(ByVal Message As String)
- MyBase.New(Message)
- End Sub
- Public Sub New(ByVal Message As String, ByVal
Inner As Exception) - MyBase.New(Message, Inner)
- End Sub
- Public Sub New(ByVal Message As String, ByVal
Inner As Exception, ByVal FileSize As Long) - MyBase.New(Message, Inner)
- mlngFileSize FileSize
- End Sub
- Public ReadOnly Property FileSize() As Long
248.5 Programmer defined Exception Classes
- Afhandelen user defined exception
- Private Sub btnUserDefined_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs)
Handles btnUserDefined.Click - Dim lngSize As Long
- ' Test a user-defined exception.
- Try
- lngSize GetSize(txtFileName.Text)
- Catch FileTooLargeExceptionParameter As
FileTooLargeException - MessageBox.Show( _
- String.Format( _
- "Please select a smaller file! " _
- "The file you selected was 0
bytes.", _ - FileTooLargeExceptionParameter.FileSi
ze)) - Catch exceptionParameter As Exception
- MessageBox.Show(exceptionParameter.Mes
sage) - End Try
- End Sub