1 • Best practice for exception handling • Exception klasser • Division med nul uden exception handling • Division med nul med exception handling •. NET exception hierarki • Finally blok • Using statement • Exception egenskaber (eng.: properties) & stack unwinding • Brugerdefinerede exception klasser Steen Jensen, efterår 2013
Stilen og detaljerne i C#’s exception handling er delvist baseret på Andrew Koenig & Bjarne Strupstrups ”Best Practices for Handling Exceptions [C#] Se 2
Nedenstående figur viser hierarkiet af exception klasser i C# 3 Figur fra s. 440 i ”Computing with C#” af Art Gittleman
4 Eksemplet viser en app, der udfører en division – som tæller (eng.: numerator) og nævner (eng.: denominator) anvendes heltal/integers Figur 13.1 viser forskellige situationer med og uden exceptions
5 Eksemplet fra figur 13.1 er nu udvidet med exception handling Linje 11-44: løkke, der kører, sålænge der er fejl (continueLoop = true) Linje 14-31: try blok, hvor de to heltal/integers indlæses, og resultat beregnes. Blokken afsluttes med at sætte continueLoop til false Linje 32-37: catch blok, der håndterer FormatException Linje 38-43: catch blok, der håndterer DivideByZeroException
6 Exception handling mekanismen i C# tillader kun objekter af klassen Exception (namespace System) at blive kastet og fanget (eng.: thow & catch) Klassen Exception er basisklasse for.NET’s exception klasse-hierarki En vigtig afledt klasse er SystemException: fx indeksering af element uden for array IndexOutOfRangeException fx brug af reference-type variabel til at kalde en metode, og referencen er null NullReferenceException andre exceptions: OutOfMemoryException, StackOverflowException For at finde ud af, hvornår en metode kan kaste (eng.: throw) en exception, kan man i Visual Studio gå ind under View + Object Browser. Under namespace System kan man se en liste over mulige exceptions
7 Programmer tildeler og frigiver (eng.: request & release) jævnligt ressourcer - fx fil åbnes …… fil lukkes til sidst Hvis en ressource ikke frigives, opstår en såkaldt resource leak I programmeringssprog såsom C & C++ er den mest almindelige ressource leak memory leak, hvor et program allokerer hukommelse (i C# via keyword new) men ikke deallokerer hukommelsen, når den ikke længere skal bruges I C# er dette ikke noget problem p.g.a. automatisk garbage collection Ved at bruge en finally blok sikres, at kode indeholdende deallokering af ressourcer altid udføres Ud over en try blok skal der også være en catch og/eller en finally blok
8 Eksemplet viser, at en finally blok altid udføres, uanset om der opstår en exception eller ej. App’en består af 4 metoder: DoesNotThrowException, ThrowExceptionWithCatch, ThrowExceptionWithoutCatch og ThrowExceptionCatchRethrow Linje : throw giver mulighed for manuelt at udløse en exception. Denne exception vil blive fanget af en tilhørende catch blok eller en finally, hvis der ikke er nogen catch Linje 124: da throw står angivet uden parametre, betyder det, at den pgældende exception rethrow’es dvs. kastes tilbage til, hvor den blev kaldt. I dette tilfælde til Main-metoden
9 Eksemplet læser indholdet af tekstfilen ”messages.data” og udskriver hver linje fra filen på skærmen (try-blokken) Hvis der opstår en IOException håndteres denne i catch-blokken Uanset, om der har været fejl eller ej, udføres kode i finally blokken, hvor tekstfilen lukkes Eksempel fra s. 451 i ”Computing with C#” af Art Gittleman
10 Et alternativ til at placere ressource-release kode i en finally blok er at benytte det såkaldte using statement Ved at benytte using placeres implicit kode i en try blok efterfulgt af en finally blok
11 Nedenstående kodestump er fra figur 17.5 klassen FileTestForm Ved at benytte using vil der automatisk udføres en finally blok, der lukker filen
12 Exception typer afledes fra klassen Exception, som har flere egenskaber (eng.: properties) - vigtige egenskaber: Message gemmer fejlmeddelelse tilknyttet et exception objekt StackTrace repræsenterer method-call stack InnerException angiver den oprindelige exception. Kan anvendes ved brugerdefinerede exceptions HelpLink specificerer lokationen på en evt. hjælpefil Source specificerer navnet på app eller objekt, der har forårsaget den pågældende exception TargetSite angiver metoden, hvor den pågældende exception opstod
13 Eksemplet demonstrerer stack unwinding, som forekommer når en exception kastes (throw) men ikke fanges (catch) det pågældende sted i koden Metodekaldet vil blive ”spolet tilbage” (eng.: unwound), og et forsøg laves på at fange den pågældende exception i den næste ydre try blok Method3 Method2 Method1 Main
14 Eksemplet udregner kvadratroden af et tal og viser endvidere, hvordan man kan oprette sin egen exception. (klassen NegativeNumberException i figur 13.6) – bemærk, at constructor findes i tre udgaver Klassen bruges i catch blokken i figur 13.7, hvis der indtastes et negativt tal
Prøv at besvare øvelse s. 554 uden at se svaret Check derefter dine svar op imod svarene s
Resten af dagen + fortsæt hjemme: 1. Ex s Hvis det giver mening, så læg fejlhåndtering (exception handling) ind i Spejdersystemet 16