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
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
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
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
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
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
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
}
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
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
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
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; }
}
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
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
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;
}
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
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)
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
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);
}
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
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);
}
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
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é
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;
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);
} }
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í
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
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)
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.)
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
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
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
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é
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
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
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 };
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 }};
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
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