160 likes | 407 Views
Exception handling 2. 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
E N D
Exception handling 2 • 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) & stackunwinding • Brugerdefinerede exception klasser • Steen Jensen, efterår 2013
Best practice for exception handling Stilen og detaljerne i C#’sexception handling er delvist baseret på Andrew Koenig & Bjarne Strupstrups”Best Practicesfor Handling Exceptions [C#] Se http://msdn.microsoft.com/en-us/library/seyhszts.aspx
Exception klasser Figur fra s. 440 i ”Computing with C#” af Art Gittleman Nedenstående figur viser hierarkiet af exception klasser i C#
Division med nul uden exception handling (figur 13.1 s. 526) • 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
Division med nul med exception handling (figur 13.2 s. 529) • 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 continueLooptil false • Linje 32-37: catch blok, der håndtererFormatException • Linje 38-43: catch blok, der håndterer DivideByZeroException
.NET exception hierarki • Exception handling mekanismen i C# tillader kun objekter af klassen Exception(namespaceSystem) at blive kastet og fanget (eng.: thow & catch) • Klassen Exceptioner basisklasse for .NET’sexception 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 namespaceSystem kan man se en liste over mulige exceptions
Finallyblok • 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 resourceleak • I programmeringssprog såsom C & C++ er den mest almindelige ressource leakmemoryleak, hvor et program allokerer hukommelse (i C# via keywordnew) 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 tryblok skal der også være en catchog/eller en finally blok
Eksempel 1 med finallyblok (figur 13.4 s. 537) • Eksemplet viser, at en finallyblok altid udføres, uanset om der opstår en exception eller ej. App’en består af 4 metoder: DoesNotThrowException, ThrowExceptionWithCatch, ThrowExceptionWithoutCatchog ThrowExceptionCatchRethrow • Linje 98 + 117: throwgiver mulighed for manuelt at udløse en exception. Denne exception vil blive fanget af en tilhørende catchblok eller en finally, hvis der ikke er nogen catch • Linje 124: da throwstår angivet uden parametre, betyder det, at den pgældendeexceptionrethrow’esdvs. kastes tilbage til, hvor den blev kaldt. I dette tilfælde til Main-metoden
Eksempel 2 med finallyblok (fra s. 451 i ”Computingwith C#” af Art Gittleman) • 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 finallyblokken, hvor tekstfilen lukkes Eksempel fra s. 451 i ”Computing with C#” af Art Gittleman
Usingstatement, 1 • Et alternativ til at placere ressource-release kode i en finally blok er at benytte det såkaldte usingstatement • Ved at benytte using placeres implicit kode i en try blok efterfulgt af en finallyblok
Usingstatement, 2 • Nedenstående kodestump er fra figur 17.5 klassen FileTestForm • Ved at benytte usingvil der automatisk udføres en finally blok, der lukker filen
Exceptionegenskaber (eng.: properties) • Exception typer afledes fra klassen Exception, som har flere egenskaber (eng.: properties) - vigtige egenskaber: • Message gemmer fejlmeddelelse tilknyttet et exceptionobjekt • StackTracerepræsenterer method-callstack • InnerExceptionangiver den oprindelige exception. Kan anvendes ved brugerdefinerede exceptions • HelpLinkspecificerer lokationen på en evt. hjælpefil • Source specificerer navnet på app eller objekt, der har forårsaget den pågældende exception • TargetSiteangiver metoden, hvor den pågældende exception opstod
Eksempel med exceptionproperties& stackunwinding(figur 13.5 s. 544) • Eksemplet demonstrerer stackunwinding, 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
Eksempel med brugerdefineret (eng.: user-defined) exceptionklasse(figur 13.6 s. 548 + 13.7 s. 549) • Eksemplet udregner kvadratroden af et tal og viser endvidere, hvordan man kan oprette sin egen exception. (klassen NegativeNumberExceptioni 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
Øvelser exception handling – i klassen Prøv at besvare øvelse 13.1 + 13.2 s. 554 uden at se svaret Check derefter dine svar op imod svarene s. 554
Programmeringsøvelser – exception handling • Resten af dagen + fortsæt hjemme: • Ex. 13.10 s. 555 • Hvis det giver mening, så læg fejlhåndtering (exception handling) ind i Spejdersystemet