Avlusning Debugger (”avlusare”) Breakpoints Watch
Kompileringsfel Två potentiella fel i detta exempel: CS0006 CS0103 class FelTest1 { public static void Main ( ) MittSpace.MittHello.SayHello(); int talet = 7; System.Console.WriteLine(Talet); } Två potentiella fel i detta exempel: CS0006 Saknad dll-fil Läs felmeddelandena noggrant, och tolka dem ”rätt”. Ofta är ett visst kompileringsfel egentligen inte ett fel, utan en konsekvens av ett fel någonstans tidigare i programmet. CS0103 ”Felstavning”
Logiska fel Två potentiella fel i detta exempel: ”Felstavning” class FelTest2 { public static void main ( ) int antalTimmar = 40; int timlön = 110; int summa = antalTimmar + timlön; System.Console.WriteLine(summa); } Två potentiella fel i detta exempel: ”Felstavning” Logiska fel är luriga, eftersom de inte ger kompileringsfel, men ett felaktigt resultat vid exekvering. Det är viktigt att ”torrköra” sina algoritmer, för att se att de räknar rätt. Felaktig algoritm
Spårutskrifter class MyTracking { public static void Main() { int a = 7; int b = 0; System.Console.Error.WriteLine ("1. a:" + a + " b:" + b); int c = a / b; System.Console.Error.WriteLine ("2. c:" + c); System.Console.WriteLine(c); } }
Exception Ett Exception är ett tillstånd, som uppstår under exekveringen, som vanligtvis innebär något felläge Vissa fel kan vi hantera (fånga) File not found Divide by 0 Array access Casting error Vissa kan vi inte hantera LinkageError VerificationError
Grundstrukturen try { … // kod där undantag kan kastas } catch (Exception e) { … } // kan vara flera catch efter varandra finally // Exekveras alltid, om man har den med
try try-blocket innehåller den kod, där vi kan anta att ett Exception kan komma att kastas. Koden kan explicit kasta ett Exception. if (...) throw ... Systemet kan kasta ett Exception (ex division med noll), utan att vi själva skriver throw
catch catch-block har kod för att hantera Exceptions Kan vara mer än ett catch-block. Måste vara minst ett. Varje catch-block är en “exception handler”. Varje catch-block specificerar typen av Exception det kan fånga och hantera. Om inget Exception kastas, exekveras inte heller catch-blocket. Om ett Exception kastas, men inget catch-block för detta finns: yttre try-catch-block söks igenom för en hanterare för detta Exception Undantaget “kastas vidare” till anropande metod
finally finally-blocket exekveras alltid, oavsett om ett Exception kastas eller inte Lämpligt för att “städa upp” efter sådant som kan ha initierats i try-blocket.
Propagering try { programsatser; } catch (Xx fel) catch (Yy fel) Om det inte finns någon hanterare för ett specifikt Exception, skickas kontrollen till “anropande” metod, I hopp om att det kan hanteras där Detta kallas för “exception propagation.” Det kan fortsätta tills den slutligen når själva operativsystemet 1 Nästlat try- block 2 3 4 5 6
throw class ExceptionTest { public static void Main( ) System.Console.Write("Ett tal:"); int a = int.Parse( System.Console.ReadLine() ); Exception ex = new Exception("Mitt felobjekt!"); try if (a == 1) throw new Exception(); if (a == 2) throw new Exception("Ett annat felobjekt!"); if (a == 3) throw ex; } catch (Exception e) System.Console.WriteLine( e.Message ); System.Console.WriteLine( e.StackTrace ); System.Console.WriteLine( e );
Att definiera egna Exceptions public class MyException : Exception { public MyException( ) : this("Sorry, mitt fel!") } public MyException(String msg) : base(msg) Vanligen två konstruktorer: Med en String som parameter Anropar superklassen Utan parametrar Anropar den andra med förbestämd textsträng
Använda egna Exceptions public class MyExceptionTest { public static void Main ( ) try Metoden(); } catch (Exception e) System.Console.WriteLine( e.StackTrace ); public static void Metoden ( ) throw new MyException();
Exempel: Division med noll public class NollDivision : ArithmeticException { public NollDivision( ) super("Division med noll!"); } public NollDivision(String msg) super(msg);
Exempel: Division med noll public class DivisionTest { public static void Main () System.Console.Write(“Tal a: “); int a = int.Parse(System.Console.ReadLine()); System.Console.Write(“Tal b: “); int b = int.Parse(System.Console.ReadLine()); try double d = Quotient(a, b); System.Console.WriteLine(d); } catch (NollDivision nd) System.Console.WriteLine( nd ); public static double Quotient (int numerator, int denominator) if (denominator == 0) throw new NollDivision(); return (double) numerator / denominator;
Exceptions i Java Java har två typer av undantag (Exception): unchecked (RunTimeExceptions) måste inte programmeraren koda hantering för (ex felaktiga talformat, felaktig indexering av arrayer). checked måste programmeraren koda hantering för (exempelvis allt som kan relateras till in- och utmatningar). Om programmet anropar en metod som kan kasta (throw) en checked exception, måste programmet ha kod för att hantera detta.
Undantagshantering Några skillnader mellan olika språk C# Java C++ Alla undantag är objekt Undantagen kan representeras av annat än objekt, ex heltal, textsträngar Alla undantag är ”unchecked” ”checked” undantag kräver obligatoriska try-catch block, eller ”throws” i metodsignaturen Catch-block utan Exception-argument tillåtet Catch-block måste ange Exception-typ