Visual Basic 6 - TI Aalst - De studentensite voor

Download Report

Transcript Visual Basic 6 - TI Aalst - De studentensite voor

Hoofdstuk 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
Visual Basic.NET
Pag.1
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 2
8.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
...
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 3
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 4
8.2 Exception Handling Overview
• Generatie van fout
Voorbeeld : openen bestand en lengte bepalen
Dim lngSize as Long
Dim s as FileStream
s=File.open(txtFileName.text, FileMode.Open)
lngSize = s.Length
s.Close()
 Wat kan er allemaal misgaan?
–
–
–
–
–
Visual Basic.NET
File bestaat niet
Pad bestaat niet
Drive is niet beschikbaar(netwerkdrive bvb)
Je hebt geen rechten om file te openen
...
Hoofdstuk 8 : Fout afhandeling
Pag. 5
8.3 Afhandelen van fouten
• Geen foutafhandeling
Runtime vangt fout op en geeft melding aan de gebruiker
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 6
8.3 Afhandelen van fouten
• Afhandelen van alle fouten (1 exceptionhandler)
Geven van melding als een fout zich heeft voorgedaan
Try
s=File.open(txtFileName.text, FileMode.Open)
lngSize = s.Length
s.Close()
Catch
Messagebox.Show(“Fout by openen bestand”)
End Try
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 7
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 8
8.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.
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 9
8.3 Afhandelen van fouten
Voorbeeld
Try
s=File.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 10
8.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.
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 11
8.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 blanco’s 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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 12
8.3 Afhandelen van fouten
 Code
Private Sub btnSpecifiekeFouten_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles btnSpecifiekeFouten.Click
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.")
Catch IOExceptionParameter As IOException
MessageBox.Show("The drive you selected is not ready.”)
Catch ExceptionParameter As Exception
MessageBox.Show("An unknown error occurred.")
End Try
End Sub
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 13
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 14
8.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”)
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 15
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
' Properties.vb
' Stack unwinding and Exception class properties.
' demonstrates using properties Message, StackTrace and
' InnerException
Class CProperties
Shared Sub Main()
Aanroepen van Main, wordt eerste methode op method call stack
' call Method1; any Exception generatesd will be caught
' in the Catch block that follows
Try
Method1()
Main roept Method 1 aan, die de 2de methode wordt op method-call stack
' Output String representation of Exception, then output
' values of properties InnerException, Message and StackTrace
Catch exception As Exception
Console.WriteLine("exception.ToString: " & _
vbCrLf & "{0}" & vbCrLf, exception.ToString())
Console.WriteLine("exception.Message: " & _
vbCrLf & "{0}" & vbCrLf, exception.Message)
Exception wordt opgevangen door
catch handler
Console.WriteLine("exception.StackTrace: " & _
vbCrLf & "{0}" & vbCrLf, exception.StackTrace)
Console.WriteLine("exception.InnerException: " & _
vbCrLf & "{0}" & vbCrLf, exception.InnerException)
End Try
End Sub ' Main
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 17
34
' calls Method2
35
Public Shared Sub Method1()
Method 1 roept Method 2 op,
36
Method2()
37
End Sub
die de derde methode op de stack wordt
38
39
' calls Method3
40
Public Shared Sub Method2()
41
Method3()
Method 2 roept Method 3 op,
42
End Sub
die de vierde methode op de stack wordt
43
44
' throws an Exception containing InnerException
45
Public Shared Sub Method3()
46
Method 3 roept method
47
' attempt to convert String to Integer
Convert.ToInt32 op
48
Try
49
Convert.ToInt32("Not an integer")
50
Daar argument geen Integer is, wordt een exception
51
' wrap FormatException in new Exception
52
Catch formatException As FormatException
geworpen en Convert.ToInt32 wordt van de stack verwijderd
53
54
Throw New Exception("Exception occurred in Method3", _
55
formatException)
56
57
End Try
De gespecifieerde exception type komt overeen met
58
het geworpen type, dus de fout wordt afgehandeld
59
End Sub ' Method3
60
61 End Class ' CProperties
Method 3 stopt en
unwinding begint
De FormatException wordt doorgegeven
exception.ToString:
aan constructor als een InnerException
System.Exception: Exception occurred in Method3 --->
System.FormatException: Input String was not in a correct format.
at System.Number.ParseInt32(String s, NumberStyles style,
NumberFormatInfo info)
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 18
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\Properties.vb:line 49
--- End of inner exception stack trace --at Properties.CProperties.Method3() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line 54
at Properties.CProperties.Method2() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line 41
at Properties.CProperties.Method1() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line 36
at Properties.CProperties.Main() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line 13
exception.Message:
Exception occurred in Method3
exception.StackTrace:
at Properties.CProperties.Method3() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line
at Properties.CProperties.Method2() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line
at Properties.CProperties.Method1() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line
at Properties.CProperties.Main() in
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line
54
41
36
13
exception.InnerException:
System.FormatException: Input String was not in a correct format.
at System.Number.ParseInt32(String 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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
C:\books\2001\vbhtp2\ch11\Fig11_03\Properties\Properties.vb:line 49
Pag. 19
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 20
8.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
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 21
8.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
Visual Basic.NET
Get
Hoofdstuk 8 : Fout afhandeling
Pag. 22
8.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
Visual Basic.NET
Get
Hoofdstuk 8 : Fout afhandeling
Pag. 23
8.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.FileSize))
Catch exceptionParameter As Exception
MessageBox.Show(exceptionParameter.Message)
End Try
Visual Basic.NET
Hoofdstuk 8 : Fout afhandeling
Pag. 24