1 / 29

Výjimky a zpracování chyb (1)

Výjimky a zpracování chyb (1). Výjimky ( exceptions ) dovolují tvorbu progra-mů , které mohou reagovat na různé chybové stavy vzniklé v jeho průběhu Cílem výjimek je učinit programy robustnější tím, že jsou rozšířeny o schopnosti správy chyb vzniklých na úrovni aplikace nebo operačního systému

berget
Download Presentation

Výjimky a zpracování chyb (1)

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Výjimky a zpracování chyb (1) • Výjimky(exceptions) dovolují tvorbu progra-mů, které mohou reagovat na různé chybové stavy vzniklé v jeho průběhu • Cílem výjimek je učinit programy robustnější tím, že jsou rozšířeny o schopnosti správy chyb vzniklých na úrovni aplikace nebo operačního systému • Výjimky v jazyku C#: • jsou objektově orientované • oddělují zpracování chyb od výkonného kódu • nejsou hlídané (jsouunchecked) • by měly být dokumentovány

  2. Výjimky a zpracování chyb (2) • Každá výjimka v jazyku C# je: • objekt • odvozena z třídy Exception nebo z některé zje-jich následníků • obsahuje informace o: • svém původu • důvodu vzniku • Pomocí zachycení výjimky je možné nastalý (chybový) stav zpracovat (obsloužit) • Jestliže dojde ke vzniku výjimky, která není ni-jak obsloužena, pak dochází k ukončení progra-mu s odpovídající běhovou chybou

  3. Výjimky a zpracování chyb (3) • Mechanismus výjimek je v jazyce C# založen na klíčových slovech: • try: • vymezuje začátek chráněného bloku kódu • jestliže nějaká operace v tomto bloku způsobí výjimku, pak je okamžitě řízení předáno do bloku, který je umí-stěný za klíčovým slovem catch • catch: • slouží k zápisu bloku, který se provede jestliže ve sdruženém chráněném bloku dojde ke vzniku výjimky • po bloku try může následovat více bloků catch, z nichž každý slouží pro ošetření specifického typu výjimky

  4. Výjimky a zpracování chyb (4) • blok catch se zapisuje ve tvaru:catch (typ_výjimky proměnná){ošetření výjimky} • proměnnáobsahuje objekt vyjadřující podrobné úda-je o vzniklé výjimce (např. vlastnost Message obsa-huje textový popis chyby, která způsobila výjimku) • poznámka: • proměnná může být v zápisu bloku catch vynechána • finally: • udává volitelný blok používaný většinou k uvolnění zdrojů alokovaných v bloku try

  5. Výjimky a zpracování chyb (5) • příkazy v tomto bloku jsou vykonány vždy, tzn. v pří-padě výskytu výjimky i v případě normálního prove-dení • throw: • slouží k vyvolání výjimky • Jestliže při provádění příkazů v bloku try dojde ke vzniku výjimky, které neodpovídá žádný blok catch, potom: • metoda, v níž byl použitý blok try je ukončenaa řízení se vrátí do volající metody • jestliže volající metoda používá blok try, pak se hledá ošetření výjimky v blocích catch tohoto bloku try

  6. Výjimky a zpracování chyb (6) • jestliže volající metoda nepoužívá blok try nebo nedefinuje odpovídající ošetření v bloku catch, pak je volající metoda ukončena řízení se vrací její volající metodě, kde se celý proces opakuje • pokud je nakonec nalezeno ošetření vzniklé vý-jimky, tak se provedou příkazy popsané v přísluš-ném bloku catch a poté se pokračuje prvním příkazem za blokem catch v metodě, která vý-jimku zachytila • není-li nikde nalezeno ošetření vzniklé výjimky, pak je program ukončen

  7. Třída Exception (1) • Definována ve jmenném prostoru System • Reprezentuje chyby, ke kterým dochází v době běhu programu • Slouží jako výchozí třída pro všechny další vý-jimky • Definuje např. vlastnosti: • Message: • vrací řetězec (text) popisující vzniklou výjimku • je nastavena jako parametr konstruktoru • Source: • vrací nebo nastavuje jméno aplikace nebo objektu, který výjimku vyvolal

  8. Třída Exception (2) • StackTrace: • vrací stav zásobníku v době vzniku výjimky • posloupnost metod, které vedly k vyvolání výjimky • příklad (zaformátováno):at Excep.Program.Div(Int32 a, Int32 b) in c:\Excep\Excep\Program.cs:line 17at Excep.Program.Main(String[] args) in c:\Excep\Excep\Program.cs:line 27 • poznámka: program musí být přeložený v režimu debug • HelpLink: • vrací nebo nastavuje URL na soubor popisující chybu • InnerException: • obsahuje informace o předcházející výjimce, která způso-bila současnou výjimku • předcházející výjimka je zaznamenána předáním (jako pa-rametr) konstruktoru současné výjimky

  9. Rozdělení výjimek • Výjimky v .NET Frameworku byly původně roz-dělovány do dvou skupin, jimž odpovídají třídy (potomci třídy Exception): • SystemException: • pro výjimky CLR (Common Language Runtime), tj. pro běhové prostředí, které se stará o spouštění programů, správu paměti, typovou bezpečnost nebo o výjimky • ApplicationException: • pro výjimky uživatelských aplikací • Zmíněné: • rozdělení dnes často není dodržováno ani v BCL • třídy zůstávají zachovány pro zpětnou kompatibiltu

  10. Typy výjimek (1) • Třídy reprezentující výjimky pro parametry: • ArgumentException: • potomek třídy SystemException • byl předán parametr s neplatnou hodnotou • pomocí vlastnosti ParamName lze zjistit jméno paramet-ru, který tuto výjimku způsobuje • ArgumentNullException: • potomek třídy ArgumentException • metodě byl předán parametr s hodnotou null, přičemž tato metoda jej neakceptuje jako platný parametr • ArgumentOutOfRangeException: • potomek třídy ArgumentException • hodnota parametru je mimo povolený rozsah

  11. Typy výjimek (2) • Třídy pro aritmetické výjimky: • ArithmeticException: • potomek třídy SystemException • nastala chyba při aritmetické operaci nebo při převodu • DivideByZeroException: • potomek třídy ArithmeticException • došlo k dělení nulou • OverflowException: • potomek třídy ArithmeticException • aritmetická operace nebo převod skončil přetečením vý-sledku

  12. Typy výjimek (3) • vznik přetečení není standardně hlídán • hlídání přetečení lze zapnout, resp. vypnout • v nastavení projektu • pomocí klíčových slov checked, resp. unchecked • příklad:intx = int.MaxValue;checked{ x++; //vyvolá výjimku OverflowException }intx = int.MaxValue;unchecked{ x++; //nevyvolá výjimku OverflowException }

  13. Typy výjimek (4) • Třídy pro výjimky při provádění I/O operací (de-finovány ve jmenném prostoru System.IO): • IOException: • potomek třídy SystemException • bázová třída pro chyby při zpracování vstupu a výstupu • FileNotFoundException: • potomek třídy IOException • vzniká při pokusu o zpřístupnění neexistujícího souboru • PathTooLongException: • potomek třídy IOException • dochází k ní jestliže cesta nebo název souboru je delší než systémem definované maximum

  14. Typy výjimek (5) • Další třídy reprezentující výjimky (odvozeny od třídy SystemException): • InvalidOperationException: • metodu není možné spustit, protože objekt není ve valid-ním stavu • například zápis do proudu, který ještě nebyl otevřen • FormatException: • formát vstupu neodpovídá požadavkům • příklad: Convert.ToInt32(”Program”) • může být vyvolána i např. v případě čtení ze souboru nebo zařízení • IndexOutOfRangeException: • pokus o manipulaci v poli s prvkem, jehož index je mimo rozsah pole

  15. Typy výjimek (6) • NullReferenceException: • pokus se o dereferencování objektu, který je null • například pokus o vyvolání jeho metody • aplikace by neměla tuto výjimku vyvolávat • InvalidCastException: • vzniká při pokusu o neplatné přetypování • příklad: (int) ”Program” • aplikace by neměla tuto výjimku vyvolávat • OutOfMemoryException: • není dostatek paměti pro pokračování programu • aplikace by neměla tuto výjimku vyvolávat ani zachytávat

  16. Typy výjimek (7) • StackOverflowException: • došlo k přetečení prováděcího zásobníku (obvykle příliš mnoho volaných metod) • aplikace by neměla tuto výjimku vyvolávat ani zachytávat • příklad:public stringBadProperty{ get { returnbadProperty; } set //StackOverflowException { BadProperty = value; } }

  17. Práce s výjimkami (1) • Konvence: • nově vytvářená výjimka (třída reprezentující výjim-ku) by měla: • být odvozena od třídy Exception nebo od nějakého následníka třídy Exception • název výjimky končí slovem Exception • Bývá vhodné přidat vlastnosti pro další infor-mace: • není vhodné předávat všechny důležité informace jen pomocí vlastnosti Message

  18. Práce s výjimkami (2) • Výjimky by měly být používány jen pro výji-mečné stavy: • zpracování výjimky je náročnější než použití podmí-něného příkazu • jestliže lze chybu očekávat často, je lepší ji řešit pro-gramově (pomocí podmíněného příkazu nebo návra-tové hodnoty) • Nikdy by: • neměla být vyvolávána výjimka přímo třídy Exception • neměl být použitý prázdný blok catch • normální užívání třídy nemělo způsobit výjimku

  19. Práce s výjimkami (3) • Výjimka může být v programu vyvolána pomo-cí klíčového slova throw • Blok catch, který danou výjimku zachytí, mů-že přidat další doplňující informace a provést je-jí opětovné vyvolání • Příklad:try{...}catch (Exception ex){ ...throw;}

  20. Práce s výjimkami (4) • nebo:try{...}catch (Exception ex){ ...throwex;} • Je-li při opětovném vyvolání výjimky použita proměnná, jež výjimku reprezentuje, dojde k re-setování zásobníku (stack trace), v němž jsou uchovávány informace o vzniklých výjimkách

  21. Výčtové typy (1) • Výčtové (enumerační) typy jsou uživatelem definované celočíselné typy • Představují ohraničenou množinu celočísel-ných konstant • Každou hodnotu výčtového typu lze převést na její celočíselný prototyp a naopak • Není-li specifikováno jinak, je celočíselným prototypem typ int (System.Int32) • Definice výčtového typu se provádí pomocí klíčového slova enum

  22. Výčtové typy (2) • Celočíselné hodnoty výčtového typu jsou dá-ny pořadím jednotlivých identifikátorů v de-finici typu (není-li uvedeno jinak): • první identifikátor má hodnotu 0 • hodnoty dalších identifikátorů se zvyšují po jedné • Příklad:enumColor{White, // (int)Color.White== 0Red,// (int)Color.Red == 1Gray, // (int)Color.Gray== 2 Blue = 5,// (int)Color.Blue == 5 Black// (int)Color.Black == 6}

  23. Pole (1) • Pole představují soubor proměnných (prvků) stejného datového typu, které mohou být označovány společným jménem • Zpřístupnění jednoho prvku se provádí pomo-cíindexu (indexů) zapisovaného (zapisova-ných) v hranatých závorkách • Prvky pole jsou v jazyku C# vždy indexovány od nuly • Pole je referenční (odkazový) datový typ • K vytvoření pole určitých rozměrů se používá klíčové slovo new

  24. Pole (2) • Vytvořením pole se automaticky vytváří in-stance abstraktní třídy Array, která je defi-nována ve jmenném prostoru System • Mezi vlastnosti třídy Arraypatří např.: • Length: • reprezentuje celkový počet prvků (ve všech rozměrech) • Rank: • vrací počet rozměrů pole • Počet prvků ve specifikovaném rozměru lze získat pomocí metody GetLength

  25. Pole (3) • Třída Array dále poskytuje metody např. pro: • kopírování polí – CopyTo • vyhledávání hodnoty v poli – BinarySearch • řazení prvků v poli – Sort • obrácení pořadí prvků – Reverse • změnu velikosti pole – Resize • Třída Array rovněž implementuje rozhraní IEnumerable prvky polí lze procházet pomocí příkazu foreach

  26. Pole (4) • Příkaz foreach: • umožňuje opakovat příkaz pro každý prvek v poli nebo v kolekci • slouží pouze pro četní dat, nikoliv pro jejich modi-fikaci • obecný tvar:foreach(typ id inpole)příkaz • Jazyk C# podporuje práci s poli: • jednorozměrnými • vícerozměrnými (pravidelná, nepravidelná)

  27. Pole (5) • Definice proměnné typu pole, vytvoření pole: • jednorozměrné pole:int[] numbers;numbers = new int[10];nebo int[] numbers = new int[10]; • dvourozměrné pole (pravidelné):double[,] matrix;matrix = new double[4,5];nebodouble[,] matrix = new double[4,5];

  28. Pole (6) • dvourozměrné pole (nepravidelné – jagged array): • pole polí • mohou mít různou délku jednotlivých řádkůint[][] jArr;jArr = new int[4][];for (int i = 0; i < jArr.Length; i++)jArr[i] = new int[jArr.Length – i]; [0] [1] [2] [3] 0 1 2 3 [0] 4 5 6 [1] 7 8 [2] 9 [3]

  29. Pole (7) • Příklady přístupu k prvkům polí: • numbers[1] • matrix[2,3] • jArr[1][2] • Poznámka: • pokus o zpřístupnění prvku mimo definovaný rozsah pole způsobí výjimku IndexOutOfRangeException

More Related