37
22-06-17 1 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

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

  • Upload
    berget

  • View
    25

  • Download
    3

Embed Size (px)

DESCRIPTION

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 - PowerPoint PPT Presentation

Citation preview

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

23-04-20 1

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

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

23-04-20 2

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

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

23-04-20 3

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

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

23-04-20 4

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

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

23-04-20 5

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

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

23-04-20 6

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:int x = int.MaxValue;checked{

x++; //vyvolá výjimku OverflowException

}

int x = int.MaxValue; unchecked {

x++; //nevyvolá výjimku OverflowException

}

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

23-04-20 7

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

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

23-04-20 8

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

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

23-04-20 9

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

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

23-04-20 10

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 string BadProperty {get {

return badProperty; }

set //StackOverflowException{

BadProperty = value; }

}

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

23-04-20 11

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

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

23-04-20 12

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

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

23-04-20 13

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;

}

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

23-04-20 14

Práce s výjimkami (4)• nebo:try{

...}catch (Exception ex){

...throw ex;

}

• 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

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

23-04-20 15

Delegáty (1)• Delegát (delegate) je datový typ, který definuje

signaturu metody• Delegáty bývají rovněž označovány jako typo-

vě bezpečné ukazatele na funkce• Deklarace delegáta definuje třídu, jež je odvo-

zena z třídy System.Delegate• Instance delegáta:

– slouží k reprezentaci odkazu (reference) na metodu (instanční i statickou)

– může být asociována s libovolnou metodou, která má kompatibilní signaturu (stejný návratový typ a stejné parametry)

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

23-04-20 16

Delegáty (2)• Umožňují předávat metody jako parametry ji-

ným metodám• Delegát se deklaruje s:

– použitím klíčového slova delegate– popisem návratového typu– popisem parametrů

• Příklad:public delegate

int BinOpDel(int op1, int op2);

• Před použitím delegáta je zapotřebí vytvořit jeho instanci, čímž dojde k asociování s kon-krétní metodou

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

23-04-20 17

Delegáty (3)• Poznámka:

– jazyk C# také povoluje přiřadit do delegáta pouze název metody

• Příklad:public static int Add(int op1, int op2) {

return op1 + op2; } static void Main(){

BinOpDel delVar = new BinOpDel(Add);// BinOpDel delVar = Add;int sum = delVar(1, 2);Console.WriteLine(sum);

}

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

23-04-20 18

Delegáty (4)• Není-li delegátu přiřazena žádná hodnota (tzv.

prázdný delegát), pak má hodnotu null • Vyvolání prázdného delegáta způsobí výjimku NullReferenceException

• Při práci s delegáty je možné použít také tzv. anonymní metody

• Anonymní metody:– umožňují psát kód delegátů přímo „in-line“– vytváří se klíčovým slovem delegate, za kterým

následuje definice anonymní funkce

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

23-04-20 19

Delegáty (5)• Příklad:public delegate

int BinOpDel(int op1, int op2);static void Main(){

int sum;BinOpDel add =

delegate(int op1, int op2){

return op1 + op2; };

sum = add(1, 2);Console.WriteLine(sum);

}

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

23-04-20 20

Delegáty (6)• Knihovna dodávaná s .NET Frameworkem

(BCL – Base Class Library) poskytuje také ge-nerické delegáty:– Action:

• delegát pro funkce bez návratové hodnoty• existuje 17 různých delegátů Action s různým počtem

generických parametrů: Action, Action<T>, Action<T1, T2>, …

– Func:• podobně jako Action existuje v 17 různých verzích,

např. Func<T, TResult>• poslední generický parametr udává typ návratové hod-

noty

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

23-04-20 21

Lambda výrazy (1)• Lambda výrazy jsou anonymní funkce, jež je

možné přiřadit do delegáta (vznikly jako zjed-nodušení anonymních metod)

• Umožňují psát lokální funkce, které mohou být předány jako parametry nebo vráceny jako hodnota volání funkce

• Často používány při psaní výrazů LINQ• Zapisovány pomocí operátoru => „přechází v“• Lambda výraz specifikuje:

– seznam vstupních parametrů (může být i prázdný) na levé straně operátoru =>

– výraz nebo příkazový blok na straně pravé

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

23-04-20 22

Lambda výrazy (2)• Příklad:(int a, int b) => { return a + b; }

• Typy parametrů si dokáže překladač odvodit a mohou být vynechány

• Jestliže má tělo výrazu na pravé straně jenom jednu operaci, pak lze vynechat složené závor-ky i klíčové slovo return:(a, b) => a + b;

• Pokud levá strana obsahuje pouze jeden para-metr, je možné vynechat i kulaté závorky:n => n * n;

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

23-04-20 23

Lambda výrazy (3)• Příklad:class Program{

public delegate int BinOpDel(int op1, int op2);

static void Main() {

BinOpDel add = (op1, op2) => op1 + op2;

int sum = add(1, 2);Console.WriteLine(sum);

} }

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

23-04-20 24

Lokální funkce (1)• Představují privátní metody, které jsou

vnořeny do člena třídy (struktury)• V jazyku C# jsou podporovány až od verze 7• Mohou být definovány a následně volány

uvnitř:– metod (včetně iterátorů a asynchronních metod)– konstruktorů– přístupových metod– anonymních metod– lambda výrazů– finalizérů– jiných lokálních funkcí

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

23-04-20 25

Lokální funkce (2)

• Definice lokální funkce nemůže zahrnovat:– specifikaci přístupnosti:

• všechny lokální funkce jsou privátní

• klíčové slovo private se neuvádí

– modifikátor (klíčové slovo) static

• Všechny lokální objekty (např. proměnné, for-mální parametry) definované na úrovni člena, který obsahuje lokální funkci, jsou dostupné i uvnitř lokální funkce

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

23-04-20 26

Události (1)• Členy třídy umožňující objektu nebo třídě rea-

govat na zprávy (události)

• Dovolují třídě nebo objektu informovat jinou třídu nebo objekt, že nastala nějaká změna (událost)

• Třída, která:– zasílá (vyvolává) událost se označuje jako publi-

sher (vydavatel)– přijímá (obsluhuje) událost se nazývá subscriber

(odběratel)

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

23-04-20 27

Události (2)• Pro události platí:

– vydavatel udává, kdy událost nastane– odběratel stanovuje, jaká akce bude provedena jako

odpověď na vzniklou událost (jako obsluha udá-losti)– událost může mít více odběratelů– odběratel může obsloužit více událostí od různých

vydavatelů

• Bývají nejčastěji využívány v souvislosti s GUI k oznámení, že došlo k nějaké uživatelské akci (např. stisknutí tlačítka myši, výběr položky z menu apod.)

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

23-04-20 28

Události (3)• Program (třída) může definovat metody, které

mají za úkol zpracovat příchozí události

• Metoda realizující zpracování (obsluhu) udá-losti se označuje jako tzv. event handler (ob-služná metoda)

• Události jsou v jazyce C# implementovány pomocí delegátů

• Parametry obslužné metody musí odpovídat definici delegáta, jež definuje její signaturu

• Metod obsluhujících události může být více

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

23-04-20 29

Události (4)• Odkaz na obslužnou metodu se:

– do události vkládá pomocí operátoru +=– z události odebírá pomocí operátoru -=

• Události se definují pomocí klíčového slova event, za nímž následuje typ delegáta asocio-vaného s touto událostí a název události

• Příklad:public delegate void EventHandler(object sender, EventArgs e) public event EventHandler Click;

• Třídy, které chtějí na vzniklou událost reago-vat, musí delegáta tohoto typu vytvořit a aso-ciovat k němu obslužnou metodu

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

23-04-20 30

Události (5)• Konvence:

– delegát události by měl mít:• dva parametry:

– objekt, který událost vyvolal– parametr typu třída EventArgs (nebo typu třída, která je ze

třídy EventArgs odvozená), jež může specifikovat další infor-mace pro obslužnou metodu

• návratový typ void– obvykle se používá delegát EventHandler

• Před vyvoláním události by se vždy mělo ově-řit, zda člen události nenabývá hodnoty null tj. otestovat, zda událost má asociovánu obsluž-nou metodu

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

23-04-20 31

Události (6)• Poznámka:

– ke každé události bývá zvykem vytvořit chráněnou virtuální metodu (OnNázevUdálosti), která danou událost vyvolá

– příklad:protected virtual void OnClick() {

EventHandler handler = Click; if (handler != null)

handler(this, EventArgs.Empty); }

– klíčové slovo protected označuje člena třídy, který je dostupný pouze v dané třídě a v třídách, které jsou z této třídy odvozené

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

23-04-20 32

LINQ (1)• LINQ (Language Integrated Query) je součást

MS .NET Frameworku umožňující jednotný přístup k datům a jejich zpracování deklarativ-ním a funkcionálním způsobem

• Představuje dotazovací jazyk (podobný SQL), který je integrovaný přímo do syntaxe jazyka C#

• Poskytuje syntaktickou kontrolu dotazů v době překladu programu

• Mezi výhody technologie LINQ patří zejména:– zjednodušení a zpřehlednění programového kódu– jednotná forma práce s různě reprezentovanými daty

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

23-04-20 33

LINQ (2)• LINQ:

– přináší nový způsob pro dotazování nad různě repre-zentovanými daty

– usnadňuje:• jejich třídění • jejich propojování • vyhledávání v nich

• Zpracovávaná data mohou být uložena např. v:– polích– kolekcích odvozených od generického rozhraní IEnumerable<T>

– XML– SQL databázích

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

23-04-20 34

LINQ (3)• Zpřehlednění práce s daty pomocí LINQ je v ja-

zyku C# dosaženo prostřednictvím:– implicitně typovaných proměnných (var)– rozšiřujících metod:

• metody rozšiřující již existující datové typy (třídy nebo struktury) dodatečnými statickými metodami

– lambda výrazů:• jednodušší forma zápisu anonymních metod

– inicializátorů objektů:• umožňují v době vytváření objektů nastavit jejich vlast-

nosti a datové položky (bez nutnosti použití specifického konstruktoru)

• příklad: Dog dog = new Dog { Name = ”Rex”, Age = 5 };

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

23-04-20 35

LINQ (4)– inicializátorů kolekcí:

• dovolují v době volání konstruktoru kolekce uvést seznam objektů

• kolekce musí implementovat rozhraní IEnumerable a obsahovat metodu Add pro vložení položky

• příklady:List<int> nums =

new List<int> { 1, 2, 3, 4, 5 };

List<Dog> dogs = new List<Dog>{ new Dog { Name = ”Rex”, Age = 5 }, new Dog { Name = ”Don”, Age = 2 }, new Dog { Name = ”Caesar”, Age = 7 }};

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

23-04-20 36

LINQ (5)– anonymních typů:

• slouží k zapouzdření proměnných bez nutnosti deklarovat datový typ

• obsahují jednu nebo více vlastností, které se nastaví při vytvoření instance a dále slouží jen ke čtení

• lze je deklarovat jen pomocí implicitně typované proměn-né (var)

• vlastnosti se určí z objektové inicializace• příklad: var Rex = new { Name = "Rex", Age = 5 };

• Překlad z dotazu LINQ na dotaz pro konkrétní platformu je realizovaný pomocí tzv. LINQ (po-skytovatelů) providers

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

23-04-20 37

LINQ (6)• Mezi nejčastěji používané poskytovatele techno-

logie LINQ patří:– LINQ to Objects:

• slouží k práci s libovolnou kolekcí (polem), která imple-mentuje rozhraní IEnumerable<T>

– LINQ to SQL:• mapuje příkazy LINQ na dotazy SQL a umožňuje práci

s MS SQL Server a MS SQL Express

– LINQ to DataSet:• používá technologii ADO.NET pro komunikaci s databá-

zemi

– LINQ to XML:• umožňuje práci se (dotazy nad) soubory XML