exception handling 2
DESCRIPTION
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 - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/1.jpg)
Exception handling 2
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
![Page 2: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/2.jpg)
Best practice for exception handling
Stilen og detaljerne i C#’s exception handling er delvist baseret på Andrew Koenig & Bjarne Strupstrups ”Best Practices for Handling Exceptions [C#]
Se http://msdn.microsoft.com/en-us/library/seyhszts.aspx
2
![Page 3: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/3.jpg)
Exception klasser
Nedenstående figur viser hierarkiet af exception klasser i C#
3
Figur fra s. 440 i ”Computing with C#” af Art Gittleman
![Page 4: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/4.jpg)
Division med nul uden exception handling (figur 13.1 s. 526)
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
![Page 5: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/5.jpg)
Division med nul med exception handling (figur 13.2 s. 529)
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
![Page 6: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/6.jpg)
.NET exception hierarki
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
![Page 7: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/7.jpg)
Finally blok
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
![Page 8: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/8.jpg)
Eksempel 1 med finally blok (figur 13.4 s. 537)
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 98 + 117: 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
![Page 9: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/9.jpg)
Eksempel 2 med finally blok (fra s. 451 i ”Computing with C#” af Art Gittleman)
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
![Page 10: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/10.jpg)
Using statement, 1
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
![Page 11: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/11.jpg)
Using statement, 2
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
![Page 12: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/12.jpg)
Exception egenskaber (eng.: properties)
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
![Page 13: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/13.jpg)
Eksempel med exception properties & stack unwinding (figur 13.5 s. 544)
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
Method3Method2Method1Main
![Page 14: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/14.jpg)
Eksempel med brugerdefineret (eng.: user-defined) exception klasse (figur 13.6 s. 548 + 13.7 s. 549)
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
![Page 15: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/15.jpg)
Ø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
15
![Page 16: Exception handling 2](https://reader035.vdocuments.us/reader035/viewer/2022062502/56814cb3550346895db9bade/html5/thumbnails/16.jpg)
Programmeringsøvelser – exception handling
Resten af dagen + fortsæt hjemme: 1. Ex. 13.10 s. 555
2. Hvis det giver mening, så læg fejlhåndtering (exception handling) ind i Spejdersystemet
16