290 likes | 421 Views
Feilhåndtering. Feil er uunngåelige!. Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. For å få et godt program må vi forholde oss til feilsituasjoner. To strategier: 1. Unngå feil 2. Håndtere feil som du forventer oppstår.
E N D
Feil er uunngåelige! • Erfaring viser at feil i dataprogrammer som består av mer enn noen få linjer ikke er til å unngå. • For å få et godt program må vi forholde oss til feilsituasjoner. To strategier: 1. Unngå feil 2. Håndtere feil som du forventer oppstår
To strategier for å håndtere feil • Unngå feil Noen typer feil kan forhindres, disse er: • Skrivefeil (syntaksfeil) – lett å forhindre • Logiske feil – svært vanskelig å forhindre • Håndtere feil som du forventer oppstår Dette er feil som ikke kan unngås, men siden vi kan forvente dem kan vi gjøre klar kode som håndterer feilene. c) Run-time feilSkjer mens programmet kjører –umulig å forhindre
Eksempel på feil - 1 Private Sub (...) Handles Button1.Click Dim tabell(10) As Integer 'Legg inn tall i tabellen For i As Integer = 1 To 10 tabell(i) = CInt(i ^ 2) + 1 'tabellposisjonen opphøyet i andre + 1 Next End Sub Hva er feil? Resultat:
Eksempel på feil - 2 Private Sub (...) Handles Button1.Click Dim tabell(10) As Integer 'Legg inn tall i tabellen For i As Integer = 1 To 10 tabell(i) = CInt(i ^ 2) + 1 'tabellposisjonen opphøyet i andre + 1 End Sub Resultat: Programmet kan ikke startes/kjøres Hva er feil?
Eksempel på feil - 3 Private Sub btnTest_Click(...) Handles btnTest.Click Dim tabell() As String Dim sr As IO.StreamReader = IO.File.OpenText("C:\test.txt") Dim i As Integer Do While sr.Peek <> -1 i += 1 ReDim tabell(i) tabell(i) = sr.ReadLine Loop MsgBox("Det var " & i & " linjer i filen") sr.close() End Sub Resultat: Hva er feil?
Eksempel på feil – 4To like programmer oppdaterer samme fil Private Sub btnTest_Click(...) Handles btnTest.Click Dim sw As IO.StreamWriter = _ IO.File.AppendText("C:\test.txt") sw.WriteLine("Hei") MsgBox("Har skrevet til fil") sw.Close() End Sub Private Sub btnTest_Click(...) Handles btnTest.Click Dim sw As IO.StreamWriter = _ IO.File.AppendText("C:\test.txt") sw.WriteLine("Hei") MsgBox("Har skrevet til fil") sw.Close() End Sub Resultat: Hva er feil?
Tre typer feil • Skrivefeil (syntaksfeil) – lett å forhindre • Logiske feil – svært vanskelig å forhindre • Run-time feil – umulig å forhindre Feil legges inn når vi skriver programmet Skjer mens programmet kjører. Skyldes omgivelsene. Kan forutsees men ikke forhindres
Håndtering av feil Som programmerer er det din oppgave å lage god kode, dvs. • Lage kode som unngår skrivefeil og logiske feil Du må forutse mulige run-time feil og • Lage kode som håndterer run-time feil
Skrivefeil = syntaksfeil = Kompileringsfeil • Feil som gjør at vi ikke kan starte programmet kalles kompilatorfeil • Når du trykker F5 for å kjøre et program vil VB oversette programmet til maskinspråk (binærkode) som maskinen forstår og kan kjøre. • Dersom VB ikke klarer å oversette koden du har skrevet gir den beskjed om en kompileringsfeil • F.eks: Skriv End If uten en If først
Håndtering av kompileringsfeil • Dette hjelper Visual Basic oss med på en svært god måte. • Prøv eksemplet på forrige ide: End If uten en If først
Run-Time feil • Run-time feil skjer mens programmet kjører. • Eksempel: Dim temperatur As Double = CDbl(txtTemp.Text) • Dersom brukeren oppgir noe annet en et tall medfører det run-time feil • Her blir programmet blir satt til å gjøre noe det ikke var laget for (designet for)
... Run-Time feil Merk: • Programmet MÅ kjøre for at vi skal oppdage denne feilen • Når tekstfeltet inneholder en lovlig verdi så vil feilen aldri oppstå
... Run-Time feil Vi kan ikke hindre at run-time feil skjer, MEN vi vet når vi kan forvente at de skjer. Som programmerer må vi legge inn kode som håndterer run-time feil.
Håndtering av run-time feil • Ved Run-time feil vil programmet gjøre et unntak, en exception, dvs. at programmet leter etter kode som skal utføres i tilfelle feil. • Dersom slik kode ikke finnes, krasjer prgrammet og brukeren må starte det på nytt. • Dette kan føre til at data som er lagt inn går tapt og det er irriterende for brukerne. • Du bør derfor legge inn kode som håndterer feil i de tilfeller du forventer at feil oppstår.
... Håndtering av run-time feil:Try - Catch - Finally • La programmet prøve (Try) koden som vi forventer kan feile — Dersom feil oppstår hopper programmet rett til et sted som fanger opp feil (Catch). • Koden etter Catch utføres, og når den er ferdig vil eventuell kode som står etter Finally utføres. • Til slutt kommer End Try
Eksempel på håndtering av Run-time feilI btnTest_click(): Sjekke at inndata er et tall – metode 1 Try Dim temperatur As Double = CDbl(txtTemp.Text) MsgBox(“Oppgitt temperatur er: " & temperatur) Catch MsgBox(“Vennligst oppgi temperatur som et tall") Finally MsgBox(“Prøv gjerne igjen") End Try
SPØRSMÅL PÅ FORELESNINGEN:Hvordan sjekke at inndata er et HELTALL? Try Dim temperatur As Integer = Convert.ToInt32(txtAvstand.Text) MsgBox(“Oppgitt temperatur er: " & temperatur) Catch MsgBox(“Vennligst oppgi temperatur som et heltall") txtTemp.Clear() Finally MsgBox(“Prøv gjerne igjen") End Try Kan bruke Convert-objektet i en Try-Catch. F.eks.: Convert.ToInt32(txtAvstand.Text) vil gi Exception dersom tekstboksen inneholder noe annet enn heltall. For desimaltall: Convert.ToDouble(txtAvstand.Text)
Eksempel på håndtering av Run-time feilI btnTest_click(): Sjekke at inndata er et tall – metode 2 If IsNumeric(txtAvstand.Text) Then temperatur = CDbl(txtHoyde.Text) MsgBox(“Oppgitt temperatur er: " & temperatur) Else MsgBox(“Vennligst oppgi temperatur som et tall") End If MsgBox(“Prøv gjerne igjen")
... Håndtering av run-time feilSjekke at inndata er i gyldig område ' F.eks. Hastighet = avstand / tid. les inndata fra tekstbokser: If IsNumeric(txtAvstand.Text) Then avstand = CDbl(txtAvstand.Text) If avstand < 0 Or avstand > 1000 Then feil = True melding = ”Avstand må oppgis som et tall mellom 0 og 1000" End If Else feil = True melding = ”Avstand skal være et tall." End If ‘ tilsvarende som ovenfor gjøres for å få lest inn tid If feil = False then hastighet = avstand / tid Else MsgBox(melding) End If
Logiske feil Den tredje typen feil er logiske feil. Logiske feil er de vanskligste å oppdage • Kalles BUGS • Med logiske feil får du ingen varsel, programmet kjører men resulatet blir feil! • Du må da granske koden i detalj for å finne feilen. (DEBUGGE) • Bruker en DEBUGGER
Option Explicit – hjelper oss • Tvinger oss til å delarere variabler før de brukes • Unngår logiske feil som f.eks: • avstand = 100 • tid = 2 • hastighet = avstad / tid • Hva er feil ovenfor? • Tips: sjekk variabelnavnene
Logisk feil – eksempel 1 Private Sub btnTest_Click(...) Handles btnTest.Click Dim minutes As Integer = 10 Dim kilometer As Double = 50 Dim timer As Double timer = minutes / 60 MsgBox(”Hastighet: " & KmiTimen(timer, kilometer) & ”km/t”) End Sub Function KmiTimen(ByVal kilometer As Double, ByVal timer As Double) As String KmiTimen = CStr(kilometer / timer) End Function
Logisk feil – eksempel 2 Private Sub btnTest_Click(...) Handles btnTest.Click Dim tabell() As String Dim sr As IO.StreamReader = IO.File.OpenText("C:\test.txt") Dim i As Integer Do While sr.Peek <> -1 i = i + 1 ReDim Preserve tabell(i) tabell(i) = sr.ReadLine Loop MsgBox("Det var " & i & " linjer i filen") End Sub
Logisk feil – eksempel 3 Private Sub btnTest_Click(...) Handles btnTest.Click Dim tabell() As String Try Dim sr As IO.StreamReader = IO.File.OpenText("C:\test.txt") Dim i As Integer Do While sr.Peek <> -1 i += 1 ReDim tabell(i) tabell(i) = sr.ReadLine sr.Close() Loop MsgBox("Det var " & i & " linjer i filen") Catch ex As Exception MsgBox("Filen finnes ikke") End Try End Sub
Objektorientering • VB er objektorientert! • F.eks. vi har brukt tekstbokser mye. • En tekstboks er et objekt • txtTemp.Text = "100" 'gir verdi til Text-feltet til boksenEgenskapen "Text" får verdi. • txtTemp.Clear() 'kaller opp et delprogram som tilhører tekstboksenOppførselen "Clear" utføres. • Et objekt har egenskaper (variabler) og oppførsel (prosedyrer / funksjoner)
Strukturer • Vi brukte strukturer for å samle informasjon om noe, f.eks. en person eller en bil Structure Bil Dim merke As String ... End Structure 'Bruker denne strukturen: Dim enBil As Bil enBil.merke = "VW" Ser at egenskaper til bil settes på samme måte som en tekstboks: enBil.merke = "VW" og txtTemp.Text = "100"
Et Objekt defineres på samme måte som en Structure med noe i tillegg • I tillegg til egenskaper har objekter oppførsel (prosedyrer/funksjoner). txtTemp.Clear() 'Clear er en subrutine som hører til tekstboks-objektet Vi kan legge inn prosedyrer eller funksjoner i en Struktur og har da grunnlaget for et objekt: egenskaper og oppførsel • Dersom vi har både egenskaper og oppførsel med kalles strukturen en klasse (Class)
Klasser og objekter Class Bil Public merke As String '... flere egenskaper (variabler) Sub visMerke() MsgBox("Merket er: " & merke) End Sub '... flere oppførsler (prosedyrer eller funksjoner) End Class 'Bruker denne Klassen: Dim enBil As New Bil() enBil.merke = "VW" enBil.visMerke() Lager/Definerer en klasse (som vi gjorde for strukturer) Lager et objekt av klassen, og bruker dette objektet.