Upload
walter
View
106
Download
0
Embed Size (px)
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 Presentation
Citation preview
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
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
Exception klasser
Nedenstående figur viser hierarkiet af exception klasser i C#
3
Figur fra s. 440 i ”Computing with C#” af Art Gittleman
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
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
.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
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
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
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
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
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
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
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
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
Ø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
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