290 likes | 385 Views
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
E N D
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
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
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
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
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
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
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
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
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
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
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
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 }
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
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
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
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; } }
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
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
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;}
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
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
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}
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
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
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
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á)
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];
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]
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