16
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

Exception handling 2

  • 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

Page 1: Exception  handling 2

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

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

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

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

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

.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

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

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

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

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

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

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

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

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

Ø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

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