Výnimky
Devätnásta prednáška
Stiahnuť PDF · 411 kBPreber si túto poznámku so svojou AI
Skopíruj pripravený podklad a vlož ho do ChatGPT, Claude alebo inej AI — bude ťa učiť alebo skúšať len z tejto poznámky.
Náhľad poznámky
Fakulta riadenia a informatiky ŽU
Výnimky
1
Pojmy zavedené v 7. prednáške(1)
Abstraktná trieda
v reálnom svete
v jazyku Java
v BlueJ/UML
Konkrétna trieda
Abstraktná metóda
v reálnom svete
v jazyku Java
2
Pojmy zavedené v 7. prednáške(2)
Vzťah is-a
Dedičnosť a extenzia triedy
Triáda triedy
meno
intenzia
extenzia
instanceof v hierarchii dedičnosti
3
Pojmy zavedené v 7. prednáške(3)
viac o LSP
riešenie problému štvorec-obdĺžnik pomocou
abstraktnej triedy
riziká porušenia LSP
znižovanie rizika
trieda Object a LSP
polymorfizmus vs dedičnosť
4
Pojmy zavedené v 7. prednáške(4)
vytváranie inštancií tried
klasická trieda
singleton
enum
abstraktná trieda
modifikátor final
zabránenie prekrytia metódy
koncová trieda
5
Cieľ
dedičnosť vs. interface
nahradenie dedičnosti návrhovým vzorom Dekorátor
imitácia interface dedičnosťou
projekt: KCaIB
Problém(1)
6
Problém(2)
7
public class PocitaciKatalog extends Katalog
{
private int aPocet;
public PocitaciKatalog()
{
aPocet = 0;
}
…
}
8
Problém(3)
public void pridaj(AVIDielo paDielo) {
aPocet++;
super.pridaj(paDielo);
}
public void pridajZoznam
(Collection<AVIDielo> paZoznam) {
aPocet += paZoznam.size();
super.pridajZoznam(paZoznam);
}
PocitaciKatalog
– fungovanie
pridaj
– funguje podľa očakávania
pridajZoznam
– funguje nesprávne
pridá dvojnásobný počet prvkov z paZoznam
Kde je chyba?
9
Problém(4)
10
public void pridaj(AVIDielo paDielo) {
aDiela.add(paDielo);
}
public void pridajZoznam
(Collection<AVIDielo> paZoznam) {
for (AVIDielo dielo : paZoznam) {
this.pridaj(dielo);
}
}
Riešenia
upraviť predka – riešenie1
odstrániť polymorfizmus v pridajZoznam
this.pridaj(dielo) -
problém
aDiela.add(dielo)
– riešenie
upraviť potomka so znalosťou predka
neprekryť metódu pridajZoznam – riešenie 2
odstrániť dedičnosť – riešenie 3
11
Rozšírenie funkcionality objektu
dedičnosť
vytvorenie podtypu
návrhový vzor Dekorátor
zabalenie objektu
– skladanie
delegovanie časti služieb na zabalený objekt
12
Návrhový vzor Dekorátor
13
Aplikácia na KCaIB
14
Riešenie cez Dekorátor(1)
15
public class PocitaciKatalog implements IKatalog {
private int aPocet;
private IKatalog aZabaleny;
public PocitaciKatalog(IKatalog paZabaleny) {
aPocet = 0;
aZabaleny = paZabaleny;
}
…
}
16
Riešenie cez Dekorátor(2)
public void pridaj(AVIDielo paDielo) {
aPocet++;
aZabaleny.pridaj(paDielo);
}
public void pridajZoznam
(Collection<AVIDielo> paZoznam) {
aPocet += paZoznam.size();
aZabaleny.pridajZoznam(paZoznam);
}
17
Riešenie cez Dekorátor(3)
public void vypisPolozky()
{
aZabaleny.vypisPolozky();
}
Využitie katalógu cez dekorátor
18
IKatalog katalog = new Katalog();
IKatalog katalog = new PocitaciKatalog(
new Katalog());
Dekorátor – pre a proti
Výhody
nenastáva polymorfizmus cez this
triedy nie sú naviazané – ich vzťah možno kedykoľvek
meniť
minimálna až žiadna závislosť
Nevýhody
nenastáva polymorfizmus cez this
chýba reuse rozhrania
kúsok ukecanejšie
19
Imitácia Interface
jazyky bez konceptu Interface
napr. C++
polymorfizmus viazaný na dedičnosť
nahrádzanie abstraktnou triedou
čisto abstraktná trieda
20
Imitácia Interface abstraktnou triedou
21
Fakulta riadenia a informatiky ŽU
Ošetrovanie chybových stavov
23
Cieľ
komunikácia klient-server
defenzívne programovanie
ošetrenie chýb
na strane servera
na strane klienta
výnimky
projekt: KCaIB
24
Behové chyby(1)
chyby v kóde, ktoré spôsobia pád aplikácie
nekorektné ukončenie
aplikácia sa vymkne spod kontroly
nečakané ukončenie v lepšom prípade
25
Behové chyby(2)
Má padnúť internetový prehliadač, ak žiadame
otvoriť neexistujúcu web stránku?
(Napr. sme pri písaní adresy urobili chybu.)
Má sa zavrieť (ukončiť prácu) súborový
manažér, ak chceme uložiť obrázok na USB
kľúč, na ktorom už nie je dostatok miesta?
Má skončiť hra, ak hráč napíše nesprávny
príkaz?
26
Behové chyby(3)
Problémy tohto typu chceme riešiť.
27
Komunikácia klient-server(1)
komunikácia dvojice objektov – odosielateľ
správou žiada adresáta o službu
odosielateľ – klient žiada o službu
klient je aktívny objekt
adresát – server poskytuje službu
server nevykonáva žiadnu akciu z vlastnej vôle,
len reakcia na žiadosť klienta
28
Komunikácia klient-server(2)
správa – parametre
správnosť parametrov – prípustné hodnoty
kto je zodpovedný?
klient
– definícia hodnôt parametrov
server
– použitie hodnôt parametrov
29
Klient
klient
– definícia hodnôt parametrov
doplňujúce informácie správy
podrobnejšia charakteristika žiadosti
klient vychádza zo svojho stavu
možná behová chyba
negatívne testovanie – zámerná behová chyba
30
Server
server
– použitie hodnôt parametrov
parametre sú charakterizované typom
typ je abstrakcia hodnôt
nie každá hodnota musí byť prípustná
určitá hodnota parametra môže vyžadovať určitý
stav servera
parametre môžu vyžadovať zmenu stavu
servera
server nesmie dopustiť, aby sa dostal do
nekorektného stavu
31
Trojvrstvový model aplikácie(1)
tri skupiny
– vrstvy – objektov aplikácie
aplikačná (biznis) vrstva – objekty logiky
aplikácie
používateľská vrstva (GUI, TUI) – komunikácia
človek – aplikácia, preberanie vstupných údajov,
prezentácia výsledkov
dátová vrstva – uloženie dát na opätovné
použitie
32
Trojvrstvový model aplikácie(2)
tri vrstvy sú voči sebe vo vzťahu klient – server
používateľská vrstva
dátová vrstva
aplikačná vrstva
33
Porušenie vzťahu klient-server
klient
„tretia strana“
server
34
Komunikácia klient-server
kto je zodpovedný?
extrémne spôsoby riešenia
klient vie presne, čo chce a ako to má od
servera korektne žiadať
server predpokladá, že sa môže stať čokoľvek
a
musí sám zabezpečiť, aby pracoval len
korektne
35
Východiská
klient nekladie nekorektné požiadavky zámerne
existujúce nekorektné požiadavky – chyby
existujú problémy mimo aplikácie – klient
nemôže poznať
36
Riešenie – odpovede na otázky
Aká veľká kontrola správ od klienta má byť v
metódach servera?
Ako má server oznamovať chyby klientovi?
Ako má klient predchádzať nekorektným
požiadavkám na server?
Ako má klient reagovať na oznámenie o chybe
37
Defenzívne programovanie
kontrola parametrov
– server
kontrola návratovej hodnoty – klient
38
Riešenie na strane servera
kontrola parametrov
reakcia na zistenú chybu
nevykoná metódu
nezmení svoj stav
informovanie o chybe
žiadne - ??? (urazená osoba)
používateľa - výpis
klienta
39
Príklad – Katalog.vymaz(1)
paTitul
nesmie byť null
nesmie byť prázdny reťazec
musí existovať AVIDielo s takým titulom
public void vymaz(String paTitul)
{
AVIDielo polozka = this.vyhladaj(paTitul);
this.aZoznamPoloziek.remove(polozka);
}
40
Príklad – Katalog.vymaz(2)
public void vymaz(String paTitul)
{
if (paTitul == null || paTitul.isEmpty()) {
// osetrenie chyby 1,2
} else {
…
41
Príklad – Katalog.vymaz(3)
…
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
// Osetrenie chyby 3
} else {
this.aZoznamPoloziek.remove(polozka);
}
}
42
Informovanie používateľa
informácia o chybe sa zobrazí používateľovi
textová forma – terminál, okno
zvukový výstup – „pípanie“ pri stlačení
nesprávneho klávesu
...
doteraz v projektoch
– výpis na terminál
43
Príklad – Katalog.vymaz(4)
public void vymaz(String paTitul)
{
if (paTitul == null || paTitul.isEmpty()) {
System.out.println("Titul musi byt zadany!");
} else {
…
44
Príklad – Katalog.vymaz(5)
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
System.out.println("Titul nie je v katalogu!");
} else {
this.aZoznamPoloziek.remove(polozka);
}
}
45
Informovanie klienta
dve možnosti
návratová hodnota správy
výnimky
46
návratová hodnota
kód chyby
boolean
– false (nastala chyba), true
(nenastala)
int
– číselný kód (1 – taká chyba; 2 – iná
chyba; 0
– bez chyby)
objekt
– null v prípade chyby (napr. pri
vyhľadávaní)
enum
– položky – rôzne typy chýb
47
Návratová hodnota objekt(1)
public AudiovizualneDielo vyhladaj(String paTitul)
{
for (AVIDielo polozka : aZoznamPoloziek) {
if (polozka.dajTitul().equals(paTitul)) {
return polozka;
}
}
return null;
}
ok
chyba
48
Návratová hodnota objekt(2)
štandardné riešenie pri vyhľadávaní
hľadaný objekt neexistuje => null
49
Návratová hodnota boolean(1)
public boolean vymaz(String paTitul)
{
if (paTitul == null || paTitul.isEmpty()) {
return false;
} else {
…
50
Návratová hodnota boolean(2)
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
return false;
} else {
this.aZoznamPoloziek.remove(polozka);
return true;
}
}
51
Návratová hodnota boolean(3)
jediná informácia – nastala chyba
vhodné pre jedinú možnosť
nevhodné pre viac rôznych chýb v metóde – ak
existuje viac možností ich ošetrenia
52
Návratová hodnota enum(1)
public KodChybyVymazania vymaz(String paTitul)
{
if (paTitul == null || paTitul.isEmpty()) {
return KodChybyVymazania.titulNezadany;
} else {
…
53
Návratová hodnota enum(2)
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
return KodChybyVymazania.nenasielSa;
} else {
this.aZoznamPoloziek.remove(polozka);
return KodChybyVymazania.ok;
}
}
54
Výnimky(1)
kontrola výnimočných stavov
oznamovanie chyby klientovi
vo väčšine prípadov preferované riešenie
55
Výnimky(2)
výnimka – objekt
informácia – názov triedy výnimky
informácia – popis situácie
56
Druhy výnimiek
kontrolované
klient nemôže ignorovať
kontroluje prekladač
nekontrolované
klient môže ignorovať
spôsobí predčasné ukončenie aplikácie – pád
prekladač nerieši
57
Hierarchia výnimiek – koreň Throwable
58
Chyby
...
59
Kontrolované výnimky
...
60
Nekontrolované výnimky
61
Výnimky a klient-server
server výnimky vytvára – „vyhadzuje“
klient výnimky zachytáva
62
Vyhodenie výnimky(1)
príkaz throw
skrátený – bežný zápis
TypVynimky vynimka = new TypVynimky("popis");
throw vynimka;
throw new TypVynimky("popis");
63
Vyhodenie výnimky(2)
príkaz throw ukončuje vykonávanie metódy
server vracia riadenie klientovi
informuje klienta o výnimke
64
Klauzula throws
throws
v hlavičke metódy – zoznam výnimiek
vyhadzovaných v metóde
kontrolované povinne
nekontrolované fakultatívne
public void uloz(String paNazovSuboru)
throws IOException
65
Priklad
– vyhodenie výnimky(1)
public void vymaz(String paTitul)
throws IllegalParameterException
{
if (paTitul == null || paTitul.isEmpty()) {
throw new IllegalParameterException(
"paTitul je prazdny");
} else {
…
66
Priklad
– vyhodenie výnimky(2)
AVIDielo polozka = this.vyhladaj(paTitul);
if (polozka == null) {
throw new IllegalParameterException(
"Titul sa nenasiel");
} else {
this.aZoznamPoloziek.remove(polozka);
}
}
67
Zachytávanie výnimky
na strane klienta
definujeme akcie, ktoré sa vykonajú v prípade
výnimky
68
Príkaz try-catch
bloky: try, catch
samostatne catch
pre každú triedu výnimiek
try {
// chranene prikazy
} catch (TriedaVynimky vynimka) {
// prikazy vykonane v pripade vynimky
}
69
Príkaz try-catch
try {
paKatalog.vymaz(paParameter);
} catch (IllegalParameterException ex) {
aTerminal.vypisRiadok("Nenasiel som");
}
ok
ko
70
Viac blokov catch
postupné vyhľadávanie typu výnimky
POZOR! len prvý vhodný blok catch
bloky catch
musia byť usporiadané
najskôr potomok – potom predok
71
Ošetrenie výnimky v bloku catch
oznámenie používateľovi
postúpenie výnimky ďalej
throw ex
72
Príkaz try-catch-finally
blok finally
– príkazy vykonávané vždy
ok
– všetky príkazy bloku try + blok finally
ko
– blok catch (ak taký je) + blok finally
uzatvorenie systémových zdrojov – súbory
verzia try-finally
príkazy try môžu byť vnorené – catch,
finally
Ďakujem za pozornosť
Automaticky vygenerovaný textový náhľad. Pre plné formátovanie si stiahnite súbor.
nechodím na prednášky