Faktisk så sent som idag fik jeg faktisk en rigtig kedelig fejlmeddelelse på en meget brugt side, som omhandlede en kodefejl i et XML dokument. Vi som kodere ved godt hvad det betyder, men hvis nu Olga Olsen med sin 386'er kom ind på siden, ville hun bruge det meste af aftenen på at klø sig i håret og derefter surfe videre til et andet website.
For at komme over det problem kan man i C# og andre .Net sprog lave noget der hedder Exception handling eller frit oversat, undtagelseshåndtering. Det betyder i bund og grund, at istedet for at brugeren får en teknisk fejlmeddelelse, kan mman lave noget kode der gør det nemmere for kunden. Såsom at der på skærmen står: "Undskyld. der er sket en fejl og du kan ikke bruge denne side lige nu. Prøv igen senere". Du kan endda samtidig lave noget kode der sender en email til dig med fejlens detaljer, så du bliver gjort opmærksom på at det gik galt. Smartere kan det ikke blive. Så lad os se på hvordan vi kan lave det i vores kode.
Try og catch
F.eks. hvis du skal forbinde til en database, er der en mulighed for at databaseserveren er nede, så det ville specielt være et sted du ville sikre dig en brugervenlig meddelelse hvis det går galt. Det kan du gøre ved hjælp af 2 keywords. Try og Catch. F.eks. Sådan her:
Try
{
//Kode der forbinder til databasen
}
Catch
{
//kode der håndterer hvis det går galt, som f.eks. 'Console.writeline("UPS")'
}
Try betyder prøv, og indikerer at imellem tuborgklammerne kommer der noget kode du gerne vil prøve om virker. Catch betyder fang, og indikerer, at hvis skidtet ikke virker fanger vi det imellem de efterfølgende tuborgklammer{}.
Finally
Det der så sker nu, er at når brugeren har fået en fejl, så kører dit website eller program ikke videre, og det er ikke altid hensigtsmæssigt. F.eks. hvis du har åbnet forbindelsen til din database, bliver den ikke lukket hvis fejlen sker når den prøver at hente noget fra databasen og det ikke findes. Og det ville tage unødige resurcer og hukommelse. For at afhjælpe det problem kan man efter Catch's tuborgklammer bruge det keyword der hedder Finally.
F.eks. sådan her:
Try {//kode der åbner databasen og henter noget}
Catch{//Kode der giver en fejlmeddelelse hvis noget går galt}
Finally{//Kode der skal afvikles efter at fejlmeddelelsen er kommet.
som at lukke databasen og viderestille brugeren til en anden webside}
Håndtere specifikke fejl hver for sig
De fleste vil allerede nu kunne se det smarte i undtagelseshåndtering. Men det slutter ikke her. Du kan rent faktisk lave en overloaded fejlhåndtering, så du kan lave en fejlmeddelelse alt efter hvad der rent faktisk går galt. .Net har nogle indbyggede måder at finde ud af hvad for en fejl der er sket, og det kan man rent faktisk bygge ind i sin catch på følgende måde:
Catch (FileNotFoundException)
{//kode der skal udføres hvis filen ikke er fundet}
Alle fejlhåndteringsmeddelelser kan findes under det namespace der hedder System.Exception
Det kan altid betale sig at skrive den fejl man tror man vil møde hyppigst som den første fejl den skal lede efter. På den måde sparer man regnekraft på at den skal igennem de første 40 muligheder før den finder den rigtige hver gang.
Få fejlens detaljer skrevet ud sammen med din fejlside
Hvis man nu vil have detaljer om fejlen med i sine fejlmeddelelser, er der også en måde man kan håndtere det. Da System.Exception er en klasse kan man oprette en ny instans af klassen i sin catch. f.eks sådan her
Catch (exception e)
Nu kan du kalde en række detaljer ved at skrive e.detaljekeyword. f.eks e.message som vil skrive på engelsk hvad for en fejl der er opstået. Disse specifikke meddelelser kan bl.a. bruges hvis man laver noget kode der sender en email til administratoren af et website når der sker fejl. Så kan man i emailen vedhæfte detaljer om fejlen, så administratoren eller webmasteren ved hvad han skal kigge efter når han skal rette fejlen. Smart ikke :-D
Lav dine egne undtagelser
Hvis i tror det er det hele, så tager i fejl. Det er jo smart nok at .Net har indbygget undtagelser, men hvad nu hvis du vil lave din egen undtagelse?
Til dette kan man benytte et keyword der hedder Throw, eller frit oversat "Kast".
Et muligt eksempel kunne være hvis man beder brugeren om at indtaste en dato, men brugeren vælger at indtaste "Jeg elsker barbiedukker". Så kan man gøre det således:
Catch
{ throw new Exception("Du har ikke indtastet en dato");}
Det smarte ved at gøre det på den måde er, at .net behandler det som en hvilken som helst anden undtagelse, og derfor kan man håndtere dem, som beskrevet længere oppe, som en hvilken som helst anden undtagelse. .Net genereret eller ej.
Afslutning
Jeg håber at det har været en tilstrækkelig forklaring på undtagelseshåndtering, men hvis i synes der mangler noget eller hvis jeg har lavet fejl eller forstået det forkert, så smid en kommentar til mig, og så retter jeg det til.
God kodelyst

2 kommentarer:
Synes godtnok det er ALT for langt til at man orker at læse det.
Det er det måske for nogle, men for andre kan det være en god hjælp til at forstå det :-) Om ikke andet er det en god hjælp til mig selv, for ved at skrive om tingene, har jeg selv nemmere ved at huske det. :-)
Send en kommentar