Fejlstyring og fejlkoder

Tags:    visual-basic
Skrevet af Bruger #65 @ 12.10.2001
Fejlstyring og fejlkoder

Som programmør skal man ikke kun interessere sig for de fejl, som er opstået. Man skal også interesse sig for mulige fejl og fejlkilder, som man ofte kan forudsige og tage forholdsregler imod. Med mulige fejl menes her kørselsfejl, som er udenfor programmørens direkte kontrol, og som optræder i applikationen i form af en risiko for at programmet i givne situationer vil blive afbrudt eller ”gå ned” på en ukontrolleret måde. En sådan fejlrisiko optræder typisk i to sammenhænge:

Dialog med brugeren

I programmer, som kræver en dialog med brugeren som f.eks. i form af indtastning eller anden form for input, optræder den fejlmulighed, at brugeren indtaster noget andet end det der var tilsigtede eller i det hele taget betjener programet på en utilsigtet måde. r4

Dialog med systemet

I programer som forudsætter en eksistens af eksterne enheder og forhold i form af f.eks. en tændt printer, tilstedeværelsen af bestemte filer og/eller mapper på maskinen osv., er det en fejlmulighed, at en eller flere af disse forudsætninger ikke er opfyldt.

Fejlstyring

Fejlstyring (error-handling) består i at erkende fejlmuligheder og indbygge mekanismer i koden, som kan få programet til at reagere på en kontrolleret måde over for en fejlkilde. Hvis programet bare ”går ned” vil det virker forvirrende og uprofessionelt på brugeren.

On Error

I Vb er On Error den sætning, som kan få en procedure til at reagere på en kørselsfejl. Det sker på den måde, at der til On Error sætningen tilføjes kode med en præcisering af , hvad der skal ske, hvis kørselsfejl opstår. Sætningen placeres som regel øverst i en procedure lige efter diverse variable erklæringer.

Etiket og Goto

Med On Error GoTo kan man efter GoTo og via navnet på en etiket angive en subrutine , som man ønsker udført, hvis kørsels fejl opstår. Det sker i vb efter følgende princip:
Sub Procedure_hændelse()


	On Error GoTo HvisFejl

	kodelinje1
	kodelinje2
	kodelinje3


	exit sub
Hvisfejl:
	kodelinjer som udføres i tilfælde af fejl

End Sub
Her er Hvisfejl en etiket (i vb med kolon), som angiver en subrutine til slut i proceduren. Hvis en kørselsfejl op står i kodelinje 1,2, eller 3 udføres subrutinen med fejlstyrings-koden, idet den kaldes af On Error GoTo og angivelse af etiketten (i vb uden kolon). Hvis ingen kørselsfejl opstår, reagere On Error ikke, og subrutinen udføres ikke.

Exit sub

Det er vigtig, at have en komando der afsluter procedure ( i vb Exit Sub) placeret lige før etiketten og fejlsubrutinen. eller vil sub rutinen blive udført, også selv om ingen fejl opstår.

Eksempel på fejlstyring

Lad os se et kort eksempel på fejlstyring. Forudsætninger: · På en formular opretter vi en tekstboks( i vb textbox) ( i delphi edit(box)) og giver den navnet tpPostnummer
· Dens Caption skal være tom
· Der skal være andre kontroller på formularen, så fokus kan flyttes til og fra tbPostnummer med mus eller

Tekstboksen oprettes til indtastning af postnummer, som for hver nye indtastning vil blive indlæst i en variable med datatypen Integer. Der er derfor en indlysende fejlmulighed i ,at brugeren måske indtaster en tekstværdi og dermed udløser en kørselsfejl. Følgende procedure med fejlstyring knyttes til tekstboksens lostfocus-hændelse.

Private sub tpPostnr_LostFocus()
	
Dim postnr as integer
On Error GoTo postnrFejl
postnr=tbpostnr.text
msgbox ”du indtastede” & postnr

Afslutfejl:
exit sub
PostnrFejl:
	msgbox tbPostnr.text & ” er forkert , prøv igen”
	tpPostnr.setfocus
	tpPostnr.text=””
	resume AfslutFejl

End sub
Med Hændelse LostFocus aktiveres proceduren, hver gang fokus flyttes væk fra teksteboksen tpPostnummer. Hvis der i tpPostnummer indtastes et postnummer eller andet tal indenfor Integers værdigrænse, opstår ingen fejl, og det indtastede tal vises i en MsgBox(messagebox) Hvis der i tpPostnummer indtaste tekstværdi eller et tal udenfor værdigrænsen, udløses en kørselsfejl i kodelinjen ”postnr=tpPostnr.text”. derfor udføres fejlsubrutinen idenficeret ved etiketten postnummerfejl. brugen får besked på at prøv igen. fokus flytter tilbage til tpPostnummer og indholdet slettes.

Resume

Sætningen Resume kan(i vb) kun anvendes i forbindelse med On Error. I eksemplet bruges der to etiketter. Efter at selve fejlsubrutinen er udført, sendes program-flowet videre med Resume Afslutfejl, hvor Afslutfejl blot indeholder en Exit sub. Dette er en traditionel måde at afslutte en Fejlstyring på i vb, og man opnår dermed, at proceduren afsluttes med exit sub, uanset om fejl opstår eller ikke. Er der bestemt kode, som ønskes udført til slut i en procedure, kan den placeres som linjer umiddelbart før Exit sub den vil dermed altid blive udført

Resume Next

Ønsker man blot at springe kodelinje(erne) over, som skaber kørselsfejl, kan man (i vb) anvende udtrykke On Error Resume Next. Dermed ignoreres fejlen, og næste linje udføres.

Fejlkode og Fejlbeskrivelse med ERR

Kun ét Error udtryk (i vb) kan være aktivt ad gangen i en procedure, og det reagere på enhver kørselsfejl, som vil afbryde proceduren, uanset hvor fejlen må lægge. Hvis man derfor ønsker at skelne mellem forskellige typer af fejl, således at der kan reageres forskelligt på dem må man bruge fejlkoder. Alle kørselsfejl, som kan opstår, har et nummer i form af en bestem type fejlkode, og man kan altid få fat i fejlkode til en bestemt type fejl ved at skrive procedure, som fremprovokere fejlen og som via objektet ( i vb) Err opfanger både fejlkode og fejlbeskrivelse. I dette eksempel afsløres fejlkode og fejlbeskrivelse til den fejl som opstår, når et for stor tal indlæse i en variable med datatypen Integer:
Dim p As Integer, x As String, y As String
On Error GoTo HvisFejl

	p=33000

AfslutFejl:
	Exit Sub
HvisFejl
	x= ”Fejlkode: ”  &  Err.Number
	y= ”Beskrivelse: ”  &  Err.Description.
	Msgbox x & Chr(10) & y

Objektet ( i vb) Err har egenskaberne ( i vb) Number og Description, hvis værdier ved denne fejl er fejlkode ( i vb) 6 og fejlbeskrivelsen (i vb) Overflow. Denne teknik kan anvendes til at finde fejlkode for alle andre typer kørselsfejl.

Fejlkoder og Systematik med Select Case

Fejlkoder har den umiddelbare fordel, at der kan skelnes mellem forskellige typer fejl, som måtte indtræffe for den samme kodelinje. Lad os se et eksempel på, hvordan fejl-koder kan bruges på en systematisk måde:

Dim Tal1 As Integer, Tal2 As Integer, resultat As Single
Dim tekst As String

	On Error Goto HvisFejl
	tal1=InputBox(”Indtast første tal”)
	tal2=InputBox(”Indtast andet tal)
	resultat=tal1/tal2
	msgbox ”Første tal divideret med andet  tal = ” & resulat

AfslutFejl:
	Exit Sub
HvisFejl:
	Select Case Err.number
	Case 6
		tekst= ”Tallet er for stort”
	Case 11
		tekst= ”Man kan ikke dividere med nul”
	Case 13
		tekst= ”Man kan ikke dividere med tekst”
	Case Else
		tekst= ”Der er opstået en eller anden fejl”
End select
Msgbox ”Fejl nr.: ” & Err.Number & Chr(10) & tekst
Resume AfslutFejl

I denne procedure anmodes brugeren først om at indtaste to tal via to Inputbox-udtryk. De indtastede tal indlæses i variablerne tal1 og tal2. Derpå divideres tal1 med tal2, og beregningen indlæse i variablen resultat, som præsenteres på skærmen i en MsgBox.

Tre fejlmuligheder

Der optræder her mindst tre forskellige fejl-muligheder i den samme linje · Første mulighed: tal1 og/eller tal2 er variabler med datatypen Integer. Hvis der indtaste værdier udenfor dataområde (fra –32767 til +32768) opstår en fejl med koden (i vb) 6
· Anden mulighed: Som tal2 indtaste et 0(nul). Da man matematisk ikke kan dividere med nul, opstår en fejl med kode (i vb) 11.
· Tredje mulighed: tal1 og/eller tal2 indtastes som bogstaver(tre) dvs. tekst. Da man ikke kan dividere med tekst værdier, opstår fejl med koden (i vb) 13

Afbrydelse af Fejlstyring

Når man med On Error har defineret, hvordan man ønsker en fejl håndteret, forbliver denne definition, aktiv indtil proceduren er udført eller afbrudt med Exit. Hvis en procedure kalder en anden procedure, og der ved udførelse af denne anden procedure opstår fejl, er On Error definition fra den kaldende procedure forsat aktiv. Fejlstyring kan imidlertid afbrydes. Det sker, når et On Error udtryk afløses af et andet, hvor det altid er det seneste, som er aktivt. Eller det sker hvis fejlstyring helt afbrydes:
On Errror Goto 0
Hermed annulleres fejlstyring og der returneres til systemet egen automatik. artiklen er skrevet af Thomas Christensen


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (3)

User
Bruger #65 @ 30.01.03 10:33
Det er lettes at lave en goto to kommando ellers
vil kode bliver meget uoverskuelig!

-Thomas
User
Bruger #65 @ 30.01.03 10:35
Efter det nye Artikel / rating system
må jeg endnu gang gøre opmærksom på
at der har snet sig et R for meget ind i koden


On Errror Goto 0


som i stedet skal hede



On Error Goto 0



for at fungere!

-Thomas
User
Bruger #789 @ 27.01.03 08:21
Husk!!! Alle fejl kræver ikke
<pre>
On Error Goto
</pre>
Men der er visse tilfælde hvor den ikke kan omgås
Du skal være logget ind for at skrive en kommentar.
t