22. juni 2011 - 14:53Der er
20 kommentarer og 2 løsninger
Fejlhåndtering
Hej med jer, Jeg har lidt svært ved at finde den "bedste" måde at håndtere fejl på. Jeg skriver lige 2 eksempler, men kom endelig mere bedre ideer (tag jer ikke af kodefejl)
Ex 1) Function Test(Byval test as string) As List(Of String) Dim fejlList As New List(Of String)()
'Noget logik
'Hvis der sker en fejl fejlList.Add(fejl)
Return fejlList End function
Altså en metode der returnerer en liste af strings som indeholder mine fejl.
Ude på min brugergrænseflade vil jeg så lave noget ala:
Dim fejlList As List(Of String) = Test("test...")
If fejlList.Count > 0 'Skriv til en fejl log
Det er bare ikke så sigende og heller ikke særligt pænt.
-----------------------------------------
Eksempel 2:
Sub Test(Byval test as string, ByRef fejlList As List(Of String)) 'Noget logik
'Hvis der sker fejl fejlList.Add(fejl) End sub
Ude på grænsefladen:
Dim fejlList as New List(Of String)() Test("Test....", fejlList)
If fejlList.Count > 0 'Skriv til fejl log..
------------------------------------- Jeg har mest valgt løsning 2, men nu kommer min kode til tider til at se ret grim ud når jeg kalder flere metoder der kræver fejlhåndtering:
Dim fejlList as New List(Of String)() Test("Test....", fejlList)
if fejlList.Count = 0 'Kalder Metode nummer 2 som også har sin egen fejlList Dim fejlList2 as new List(Of String)() Test2("Test2...", fejlList2)
if fejlList2.Count > 0 'Skriv til fejllog end if else 'skriv til fejllog end if
Der kan sagtens være en masse "Skriv til fejl log" hele vejen ned og det irriterer mig lidt..
Så mit spørgsmål.. god/pæn fejlhåndtering.. How to? :)
Altså personligt vil jeg mene det er tosset at gøre det sådan. Jeg ville bare kaste den videre og så fange den, der hvor du på nuværende tidspunkt læser fra din liste.
jeg har lidt svær ved at se hvorfor du ønsker at lægge exceptions ned i en database... -Skal du ikke bare håndtere dem og så videre i teksten?
Du er med på at hvis du i en catch blok fanger ex, kan du bare sige throw ex, så fortsætter den op af stakken?
Man kan sige at du flytter noget data der normalt ligger på stakken ind i din liste. -Og det ser jeg ikke umiddelbart nogen grund til.
jeg har lidt svær ved at se hvorfor du ønsker at lægge exceptions ned i en database... -Skal du ikke bare håndtere dem og så videre i teksten?
Hvis jeg har et program/service der står og kører om natten vil jeg gerne kunne tjekke hvad der er gået galt hvis systemet ikke kører som det skal.. Jeg kunne også smide sådan nogle ting ned i Application loggen men jeg føler har jeg et bedre overblik i min egen log hvor jeg kan logge hvad jeg har lyst til.
Hvordan vil du logge 2 fejl på samme tid? I mit tidligere eksempel kan der jo godt være en valideringsfejl som jeg gerne vil logge så jeg kan se hvad brugeren gjorde galt, men jeg har ikke lyst til at kaste denne som en exception da systemet i princippet godt kan køre videre.. jeg føler lidt at exceptions er "store" ting som gør at jeg ikke kan komme videre og derfor at nød til at afbryde
Nej, sådan må du ikke opfatte en exception. En exception skal kastes når du kommer ud for en situation du ikke - på det pågældende sted - i koden kan gøre noget ved. Ved at kaste den, 'håber' du der er nogen/noget på et højere niveau der ved hvad der så skal ske.
Et eksempel kunne være en database timeout. metoden der opererer med databasen ved sandsynligvis ikke hvad der skal ske i tilfælde af en sådan, men hvis der er en GUI vil det være meget simpelt blot at ignorere fejlen og bede brugeren forsøge igen når der er netforbindelse.
Hvis du ønsker at logge ting som ikke nødvendigvis er exceptions, tror jeg du skulle overveje at lave en 'helper' du kan kalde, som så sørger for at skrive til databasen. Når du så opdager en validerings fejl (som bestemt heller ikke skal kaste en exception!!) laver du et kald som minder om dette:
Helper.RegistrerError("msg");
Helperen skal så indeholde logik til at gemme fejlene ned i databasen og hvad du ellers måtte ønske.
Du kan indkapsle din Main() i en try-catch blok, og kommer man i catch delen, ved du der er blevet kastet en exception som du ikke har håndteret. Jeg anbefaler dig at gemme stackTracen fra dine exceptions, da det hjælper MEGET når du skal finde ud af hvad fejlen er.
Håber det giver nogenlunde mening !? Det er naturligvis kun mit forslag til en løsning :-D
B) man skal vaere opmaerksom paa at Java har checked og unchecked exceptions mens .NET kun har unchecked exceptions, saa noget er ikke relevant for VB.NET
C) jeg er meget uenig i at "log and throw" er et anti pattern
det er ikke det store praktiske problem at samme problem giver anledning til flere loggede exceptions
det er derimod et stort problem at kode goer nogle antaglser omkring den kaldende kode med hensyn til logning af fejl som ikke bliver checket og som kan have meget uheldige foeler hvis de ikke er opfyldt
plug1n: Jeg føler bare det hjælper min kode mere hvis jeg tjekker en "fejlList" igennem for alle slags fejl fremfor kun at håndtere "ikke exceptions".
Main() Metode1(fejlList)
if fejlList.Count > 0 'Log her, uanset om fejlen indeholde en exception med stacktrace eller om det er en valideringsfejl. Jeg skal ikke få lov til at komme videre i systemet, men jeg vil logge hvorfor. end if
Modsat:
Main() Try Metode1(feljList)
if fejlList.Count > 0 'Log en masse andet udover exceptions end if Catch(ex As Exception) 'Log exception End Try
Arne: Du har ret i at det er dumt at jeg laver en liste for hver gang, det behøver jeg naturligvis ikke
3) exceptions er en rigtige maade at returnere fejl fra lavere lag til hoejere lag, men paa et tidspunkt skal de jo fanges og haanteres
Hvad siger du til min løsning med at smide alle former for fejl i en liste?
En anden ting var noget af det jeg prøvede at beskrive tidligere. Hvis vi ser bort fra om fejlList skal medtage Exceptions eller ej så vil jeg til tider løbe i en situation ala:
Main() Metode1(fejlList) if fejlList.Count > 0 'Log else Metode2(fejlList) if fejlList.Count > 0 'Log else Metode3(fejlList) if fejlList.Count > 0 'Log end if end if end if
osv.. Der kan godt komme en del "if fejlList.Count > 0 blabla..", det er ik skide pænt.. har i nogle forslag her?
Hej Arne. Jeg kunne godt tænke mig at høre lidt mere om den strategi med at returnere fejllister. Hvilke fordele indebærer det at gøre sådan?
Poul. Grunden til jeg ikke ville gøre det med at sende lister rundt, skyldes at jeg ville mene det forurener koden. Et kald ud til en static helper metode er til at forstå når du vender tilbage til koden.
Men nu er jeg ikke senior udvikler endnu, så lur mig om ikke Arne har en kende mere styr på det :-)
mht #13 Jeg er ikke sikker på hvad du mener Arne.. Jeg vil jo kun kalde Metode2 hvis der ikke er nogle fejl i metode1, så jeg er vel nød til at lave et tjek? Kan du give et eksempel muligvis, jeg vil gerne slippe af med det kode i hvert fald hvis jeg kan
Lad os sige at M1 er en metode som henter en bruger fra databasen. Denne metode fejler så, kan være pga. en validering, og man får ikke en bruger tilbage.
Metode2 kræver så at man skal bruge denne bruger, men i dit eksempel tjekker man ikke for fejl i metode1, så man kalder bare metode2 uden en bruger og så fejler den også naturligvis.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.