Exceptions (undantag) Murach s: kap 7 2013-01-28 1 Winstrand Development
Exceptions (undantag) Inträffar ett oförutsägbart fel i när programmet körs kommer ett undantag (exception) att inträffa Undantaget kommer att kastas (throw) För att hantera undantaget måste detta tas emot (catch) Om vi inte fångar undantaget kommer programmet att krascha Winstrand Development 2013-01-28 2
Hantera undantag Inträffar ett exception kommer Visual Studio stanna debuggern och visa ett felmeddelande Alla undantag härstammar från Exceptionklassen //FormatException string witherror = "10.Fail"; double value = double.parse(witherror); //DivideByZeroException int iszero = 0; int badcalc = 3 / iszero; Winstrand Development 2013-01-28 3
Hantera undantag Hanteringen av ett exception sker i ett trycatch-block Kritiska instruktioner körs i try-blocket Om ett undantag kastas i try-blocket fångas det upp i catch-blocket. try //"Försök" att utföra kritisk instruktion... catch //Sker ett undantag hanterar vi detta här //Här fortsätter programmet som vanligt Winstrand Development 2013-01-28 4
Exempel på att hantera undantag Try-blocket innehåller två farliga instruktioner double.parse Division med value try decimal result = 0; //Parse är kritisk kan bara hantera siffror decimal value = decimal.parse(txtvalue.text); //Kritiskt - value kan vara 0 result = 30.0m / value; catch //Hantera undantaget //I detta fall skrivs ett meddelande ut //i en meddelanderuta MessageBox.Show("Ett fel inträffade", "Error"); Winstrand Development 2013-01-28 5
Fånga undantag I catch kan vi ange att vi fångar ett specifikt undantag Beskrivning hjälp om undantaget: Message en sträng som beskriver felet StackTrace Metoderna som anropats när felet inträffade try decimal result = 0; decimal value = decimal.parse(txtvalue.text); result = 30.0m / value; catch (Exception ex) MessageBox.Show(ex.Message, "Error"); Winstrand Development 2013-01-28 6
Hantera specifika undantag Alla undantag härstammar från basklassen Exception Vi kan strukturerat hantera undantagen Ett catch-block per undantag som ska hanteras Ange det mest specifika undantaget först Winstrand Development 2013-01-28 7
Hantera specifika undantag string msg = string.empty; try decimal result = 0; decimal value = decimal.parse(txtvalue.text); result = 30.0m / value; msg = "Resultat: " + result; catch (FormatException ex) msg = "Inte ett giltigt tal." + Environment.NewLine + ex.stacktrace; catch (DivideByZeroException ex) msg = "Kan inte dividera med 0." + Environment.NewLine + ex.stacktrace; catch (Exception ex) //tar hand om resterande undantag msg = ex.message + Environment.NewLine + Environment.NewLine + ex.stacktrace; MessageBox.Show(msg); Winstrand Development 2013-01-28 8
Finally Läggs till efter catch-blocken Körs alltid, oavsett om ett exception inträffat eller inte Användbart när vi måste lämna ifrån oss resurser try //... catch (Exception ex) //... finally //Körs alltid Winstrand Development 2013-01-28 9
Finally string msg = string.empty; try //Känsliga operationer DatabaseConnection.Open(); UseResources(); msg = DatabaseConnection.Read(); catch (Exception ex) msg = ex.message + Environment.NewLine + Environment.NewLine + ex.stacktrace; finally //Stäng alltid databaskoppling DatabaseConnection.Close(); CleanupResources(); MessageBox.Show(msg); Winstrand Development 2013-01-28 10
Kasta exceptions Vi kan generera undantag själva När ett undantag genereras kastar vi det Görs med nyckelordet throw decimal SafePositiveDivide(decimal numerator, decimal denominator) decimal result; if (denominator == 0m) throw new DivideByZeroException("Kan inte dividera med 0"); else if (numerator < 0m denominator < 0m) throw new ArithmeticException("Kan bara beräkna positiva tal"); result = numerator / denominator; return result; Winstrand Development 2013-01-28 11
Rethrow exceptions I catch-blocken kan vi kasta vidare ett exception Görs om vi inte kan/vill hantera undantaget i metoden Undantaget kastas till anropande metoden Använd throw på det exception du vill kasta vidare try decimal value = decimal.parse(txtvalue.text); catch (Exception ex) throw ex; Winstrand Development 2013-01-28 12
Validering Murach s s. 200-212 2013-01-28 13 Winstrand Development
Validering Datavalidering Se till att data är i rätt format Exempel Det måste finnas text i en textruta Texten i en textruta måste vara i double-format Ett tal ska ligga innanför givna gränser Görs med if-satser och try-catch Misslyckas valideringen ska användaren få meddelande om detta Winstrand Development 2013-01-28 14
Validering Validering i metoder Ofta utförs samma validering på flera kontroller Skapa metoder som tar emot en TextBox som parameter och utför validering på denna Winstrand Development 2013-01-28 15
Validering Exempel private void btncalculation_click(object sender, EventArgs e) if (IsPresent(txtValue1, "Värde 1") && IsDecimal(txtValue1, "Värde 1")) decimal value = decimal.parse(txtvalue1.text); //Texten är validerad och säker att använda... bool IsPresent(TextBox box, string name) bool success = true; if (box.text == "") MessageBox.Show(name + " måste innehålla ett värde", "Fel"); success = false; return success; bool IsDecimal(TextBox box, string name) bool success = true; try decimal.parse(box.text); catch (FormatException) MessageBox.Show(name + " är inte i decimalformat", "Fel!"); success = false; return success; Winstrand Development 2013-01-28 16
Validering Validera flera kontroller Bygg på i if-satsen med && (logiskt OCH) Kan lägga validering av kontrollerna i en egen metod private void btncalculation_click(object sender, EventArgs e) if (IsPresent(txtValue1, "Värde 1") && IsDecimal(txtValue1, "Värde 1") && IsPresent(txtValue2, "Värde 2") && IsDecimal(txtValue2, "Värde 2")) //Båda kontrollerna har validerats och säkra att använda... decimal value1 = decimal.parse(txtvalue1.text); decimal value2 = decimal.parse(txtvalue2.text); //beräkningar Winstrand Development 2013-01-28 17