Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja.

Samankaltaiset esitykset


Esitys aiheesta: "Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja."— Esityksen transkriptio:

1 Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja catch. try aloittaa poikkeuskäsittelylohkon, johon ohjelmoija kirjoittaa virhealttiin ohjelmakoodin. Jos try-lohkossa tapahtuu virhe, throw luo poikkeuksen, jonka catch-lohko käsittelee. catch-lohko sisältää kullekin virhetilanteelle käsittelijän. try- ja catch-lohkot sijaitsevat suoritusjärjestyksessä peräkkäin.

2 Poikkeuskäsittely- lohkot tMyn2 Poikkeus voi olla mitä tahansa tyyppiä oleva tieto tai olio. Usein on hyödyllistä määritellä poikkeuksen käsittelyä varten erillinen luokka, johon voidaan määritellä tietojäseniä virhetilanteiden tallettamista varten. Kun poikkeustilanne syntyy, ohjelman eteneminen keskeytyy, ja ohjelma etsii sopivaa poikkeuksenkäsittelijää.

3 Poikkeuskäsittely- lohkot tMyn3 try-catch -lohkot: try { //virhealtis toiminta } catch (tyyppi poikkeus) { //poikkeuskäsittely } catch(...) { //poikkeuskäsittely }

4 Poikkeuskäsittely- lohkot tMyn4 try- ja catch -lohkot sijaitsevat suoritusjärjestyksessä peräkkäin. try-lohko sisältää ohjelmakoodin, joka voi aiheuttaa poikkeustilanteen. catch-lohkossa voidaan määritellä poikkeuskäsittelijä kullekin eri poikkeukselle. Poikkeuskäsittelijä on catch-lohkossa sijaitseva ohjelmakoodi. Poikkeustieto tai olio määritellään catch-sanan jäljessä olevien sulkeiden välissä.

5 Poikkeuskäsittely- lohkot tMyn5 tyyppi tarkoittaa poikkeustiedon tai olion tyyppiä ja poikkeus on tieto tai olio, johon voidaan viitata catch- lohkossa. Poikkeus on paikallinen lohkossa. Jos sulkeiden sisällä on kolme pistettä, käsittelee lohko minkä tahansa poikkeustilanteen. Poikkeuskäsittelylohkot voivat olla myös sisäkkäisiä, joten ne voivat muodostaa sisäkkäisiä tasoja.

6 Poikkeuskäsittely- lohkot tMyn6 Poikkeustilanteen aiheuttaminen varatulla sanalla throw: throw (poikkeukset); throw; Poikkeukset määritellään throw-sanan jäljessä. Poikkeukset voivat olla sulkeiden sisällä. Jos tilanteesta syntyy useita poikkeuksia, on poikkeukset eroteltava pilkulla toisistaan. throw-sanaa käytetään normaalisti try-lohkossa. catch-lohkossa on kuitenkin mahdollista nostattaa uusi poikkeustilanne.

7 Poikkeuskäsittely- lohkot tMyn7 Tällöin voidaan throw-sanaa käyttää ilman erityistä poikkeustietoa, jolloin poikkeuskäsittely siirretään seuraavaksi korkeammalle poikkeuskäsittelytasolle sisäkkäisissä poikkeuskäsittelyrakenteissa. Jos throw esiintyy uloimmalla tasolla, ohjelma kutsuu terminate-funktiota. Kokeillaan try-catch –rakenteen toimintaa. Jos catch- lohkossa ei ole tarvetta käyttää mitään sellaista tietoa joka pitäisi tuoda throw-tapahtuman mukana, niin silloin catch-sanan jälkeisiin sulkuihin riittää pelkkä tieto siitä, minkä tyypin poikkeus siinä lohkossa käsitellään:

8 Poikkeuskäsittely- lohkot tMyn8 #include "stdafx.h" #include using namespace System; using namespace std; int main(array ^args) { double osamaara=0, jaettava=0, jakaja=0; cout<<"Anna jaettava ja jakaja, whitespace v\204liin! "; while(cin>>jaettava>>jakaja) { try { if(jakaja==0)

9 Poikkeuskäsittely- lohkot tMyn9 throw(jakaja); osamaara=jaettava/jakaja; cout<<"Osam\204\204r\204ksi saatiin " <<osamaara<<"."<<endl; } catch(double) cout<<"Jakaja ei saa olla sit\204 sun t\204t\204!” <<endl; cout<<"Anna jaettava ja jakaja, whitespace v\204liin!\n" <<"Jos haluat lopettaa, anna jokin kirjain: "; } return 0; } Pelkkä tieto poikkeuksen tyypistä riittää!

10 Poikkeuskäsittely- lohkot tMyn10 Monipuolistetaan edellistä esimerkkiä lisäämällä catch-sanan jälkeisiin sulkuihin tyypin lisäksi se tieto, joka saatiin throw-tapahtumasta:

11 Poikkeuskäsittely- lohkot tMyn11 #include "stdafx.h" #include using namespace System; using namespace std; int main(array ^args) { double osamaara=0, jaettava=0, jakaja=0; string viesti; cout<<"Anna jaettava ja jakaja, whitespace v\204liin! "; while(cin>>jaettava>>jakaja)

12 Poikkeuskäsittely- lohkot tMyn12 { try { if(jakaja==0) throw(jakaja); if(jaettava>99999) { viesti="Ei noin isoja lukuja, please!!"; throw viesti; } osamaara=jaettava/jakaja; cout<<"Osam\204\204r\204ksi saatiin " <<osamaara<<"."<<endl; }

13 Poikkeuskäsittely- lohkot tMyn13 catch(double jakaja) { cout<<"Jakaja ei saa olla: " <<jakaja<<"!"<<endl; } catch (string tiedote) { cout<<tiedote<<endl; } cout<<"Anna jaettava ja jakaja, whitespace v\204liin!\n" <<"Jos haluat lopettaa, anna jokin kirjain: "; } return 0; }

14 Poikkeuskäsittely- lohkot tMyn14

15 Poikkeuskäsittely- lohkot tMyn15 Ohjelmoija voi määritellä erilaisiin poikkeustilanteisiin liittyviä poikkeusluokkia. Poikkeusluokkaan luodaan poikkeusolio poikkeustilanteen syntyessä throw-sanalla. Poikkeusluokan ja –olion käyttö vastaa tavallisen luokan ja sen olion käyttöä. Yksi luonnollisimmista luokkarakenteista tässä tilanteessa lienee sisäkkäiset luokat (nested classes). Rakenne on sellainen, että toteutettavaan luokkaan sisällytetään tuon kyseisen luokan poikkeusluokka. Aletaan rakentamaan tällaista sisäkkäistä luokkarakennetta ”ihan alusta”.

16 Poikkeuskäsittely- lohkot tMyn16 Olkoot luokkana suorakaide, ja luokan tietojäseninä ovat suorakaiteen leveys ja korkeus. Tässä lähtöversiossa ei ole toteutettuna mitään poikkeusluokkaa, vaan ohjelma keskeytetään, jos leveydeksi tai korkeudeksi annetaan negatiivinen arvo:

17 Poikkeuskäsittely- lohkot tMyn17 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

18 Poikkeuskäsittely- lohkot tMyn18 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::Suorakaide() { cout<<"Oletusmuodostin, olio "<<this<<endl; AsetaLeveys(); AsetaKorkeus(); }

19 Poikkeuskäsittely- lohkot tMyn19 void Suorakaide::AsetaLeveys() { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) m_leveys=leveys; else { cout<<"Annoit virheellisen leveyden!"<<endl; exit(EXIT_FAILURE); }

20 Poikkeuskäsittely- lohkot tMyn20 void Suorakaide::AsetaKorkeus() { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) m_korkeus=korkeus; else { cout<<"Annoit virheellisen korkeuden!"<<endl; exit(EXIT_FAILURE); } void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

21 Poikkeuskäsittely- lohkot tMyn21 // poikkeusSuorak1Main.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { Suorakaide eka=Suorakaide(); eka.LaskeAla(); return 0; }

22 Poikkeuskäsittely- lohkot tMyn22

23 Poikkeuskäsittely- lohkot tMyn23 Muutetaan jäsenfunktioita AsetaLeveys() ja AsetaKorkeus() siten, että ohjelmasta tulee käyttäjäystävällisempi – siis ”pakotetaan” käyttäjä antamaan tolkulliset arvot. Muutoin ratkaisu on sama kuin edellä:

24 Poikkeuskäsittely- lohkot tMyn24 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

25 Poikkeuskäsittely- lohkot tMyn25 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::Suorakaide() { cout<<"Oletusmuodostin kutsuttu, olio "<<this<<endl; AsetaLeveys(); AsetaKorkeus(); }

26 Poikkeuskäsittely- lohkot tMyn26 void Suorakaide::AsetaLeveys() { bool koetasUudelleen=true; while(koetasUudelleen) { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) { m_leveys=leveys; koetasUudelleen=false; } else { cout<<"Annoit virheellisen leveyden!"<<endl; koetasUudelleen=true; }

27 Poikkeuskäsittely- lohkot tMyn27 void Suorakaide::AsetaKorkeus() { bool koetasUudelleen=true; while(koetasUudelleen) { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) { m_korkeus=korkeus; koetasUudelleen=false; } else { cout<<"Annoit virheellisen korkeuden!"<<endl; koetasUudelleen=true; }

28 Poikkeuskäsittely- lohkot tMyn28 void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

29 Poikkeuskäsittely- lohkot tMyn29 // poikkeusSuorak2Main.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { Suorakaide eka=Suorakaide(); eka.LaskeAla(); return 0; }

30 Poikkeuskäsittely- lohkot tMyn30

31 Poikkeuskäsittely- lohkot tMyn31 Lisätään luokkaan Suorakaide jäsenfunktioksi poikkeusluokka ilman ensimmäistäkään tietojäsentä tai jäsenfunktiota. Annetaan siis järjestelmän generoida tarvittaessa poikkeusluokan oletusmuodostin. Poikkeusluokkaan luodaan poikkeusolio poikkeustilanteen syntyessä throw-sanalla. Tässä riittää, että catch-sanan jälkeisiin sulkeisiin liitetään tieto pelkästään poikkeuksen aiheuttaneen olion tyypistä (vrt. ensimmäinen esimerkki!)

32 Poikkeuskäsittely- lohkot tMyn32 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: //Poikkeusluokka class negatiivinenArvo {}; Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

33 Poikkeuskäsittely- lohkot tMyn33 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::Suorakaide() { cout<<"Oletusmuodostin, olio "<<this<<endl; AsetaLeveys(); AsetaKorkeus(); }

34 Poikkeuskäsittely- lohkot tMyn34 void Suorakaide::AsetaLeveys() { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) m_leveys=leveys; else throw negatiivinenArvo(); } Kutsutaan poikkeusluokan oletusmuodostinta nimellä, vaikka se siis on kääntäjän generoima.

35 Poikkeuskäsittely- lohkot tMyn35 void Suorakaide::AsetaKorkeus() { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) m_korkeus=korkeus; else throw negatiivinenArvo(); } void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

36 Poikkeuskäsittely- lohkot tMyn36 // poikkeusSuorak3Main.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { try { Suorakaide eka=Suorakaide(); eka.LaskeAla(); } catch (Suorakaide::negatiivinenArvo) { cout<<"Annoit negatiivisen luvun."<<endl; } return 0; } Pelkkä tyyppitieto riittää.

37 Poikkeuskäsittely- lohkot tMyn37

38 Poikkeuskäsittely- lohkot tMyn38 Edellinen esimerkki voitaisiin muuttaa siten, että toteutettaisiin itse oletusmuodostin (joka ei tässä vaiheessa kylläkään tekisi mitään). Ohjelman toiminta pysyisi siis muuttumattomana. Kokeillaan sitä:

39 Poikkeuskäsittely- lohkot tMyn39 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: class negatiivinenArvo { public: negatiivinenArvo(); }; Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

40 Poikkeuskäsittely- lohkot tMyn40 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::negatiivinenArvo::negatiivinenArvo() { cout<<"Poikkeusluokan muodostin, olio "<<this<<endl; } Suorakaide::Suorakaide() { cout<<"Suorakaide-luokan oletusmuodostin, olio "<<this<<endl; AsetaLeveys(); AsetaKorkeus(); }

41 Poikkeuskäsittely- lohkot tMyn41 void Suorakaide::AsetaLeveys() { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) m_leveys=leveys; else throw negatiivinenArvo(); }

42 Poikkeuskäsittely- lohkot tMyn42 void Suorakaide::AsetaKorkeus() { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) m_korkeus=korkeus; else throw negatiivinenArvo(); } void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

43 Poikkeuskäsittely- lohkot tMyn43 // poikkeusSuorak3aMain.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { try { Suorakaide eka=Suorakaide(); eka.LaskeAla(); } catch (Suorakaide::negatiivinenArvo) { cout<<"Annoit negatiivisen luvun."<<endl; } return 0; }

44 Poikkeuskäsittely- lohkot tMyn44

45 Poikkeuskäsittely- lohkot tMyn45 Monipuolistetaan ohjelman toimintaa siten, että toteutetaan poikkeusluokat erikseen leveydelle ja korkeudelle. Lisäksi ”pakotetaan” jälleen ohjelman käyttäjä antamaan kelvolliset arvot:

46 Poikkeuskäsittely- lohkot tMyn46 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: class negatiivinenLeveys { public: negatiivinenLeveys(); }; class negatiivinenKorkeus { public: negatiivinenKorkeus(); };

47 Poikkeuskäsittely- lohkot tMyn47 Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

48 Poikkeuskäsittely- lohkot tMyn48 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::Suorakaide() { cout<<"Suorakaide-luokan oletusmuodostin, olio "<<this<<endl; m_leveys=0; m_korkeus=0; }

49 Poikkeuskäsittely- lohkot tMyn49 void Suorakaide::AsetaLeveys() { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) m_leveys=leveys; else throw negatiivinenLeveys(); }

50 Poikkeuskäsittely- lohkot tMyn50 void Suorakaide::AsetaKorkeus() { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) m_korkeus=korkeus; else throw negatiivinenKorkeus(); } Suorakaide::negatiivinenLeveys::negatiivinenLeveys() { cout<<"negatiivinenLeveys-luokan poikkeus, olio "<<this<<endl; }

51 Poikkeuskäsittely- lohkot tMyn51 Suorakaide::negatiivinenKorkeus::negatiivinenKorkeus() { cout<<"negatiivinenKorkeus-luokan poikkeus, olio "<<this<<endl; } void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

52 Poikkeuskäsittely- lohkot tMyn52 // poikkeusSuorak4Main.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { Suorakaide eka=Suorakaide(); bool koetasUudelleen=true;

53 Poikkeuskäsittely- lohkot tMyn53 while(koetasUudelleen) { try { eka.AsetaLeveys(); koetasUudelleen=false; } catch (Suorakaide::negatiivinenLeveys) { cout<<"Annoit negatiivisen luvun " <<"suorakaiteen leveydeksi."<<endl; } koetasUudelleen=true;

54 Poikkeuskäsittely- lohkot tMyn54 while(koetasUudelleen) { try { eka.AsetaKorkeus(); koetasUudelleen=false; } catch (Suorakaide::negatiivinenKorkeus) { cout<<"Annoit negatiivisen luvun " <<"suorakaiteen korkeudeksi."<<endl; } eka.LaskeAla(); return 0; }

55 Poikkeuskäsittely- lohkot tMyn55

56 Poikkeuskäsittely- lohkot tMyn56 Tarkennetaan edellistä esimerkkiohjelmaa siten, että annetaan ohjelman käyttäjälle tieto siitä mitä tuli annettua – jos tuli annettua virheellinen arvo. Tämä edellyttää poikkeusluokkien uudelleenkirjoittamista:

57 Poikkeuskäsittely- lohkot tMyn57 // Suorakaide.h #ifndef SUORAKAIDE_H #define SUORAKAIDE_H class Suorakaide { public: class negatiivinenLeveys { public: negatiivinenLeveys(double); double HaeArvo(); private: double m_arvo; };

58 Poikkeuskäsittely- lohkot tMyn58 class negatiivinenKorkeus { public: negatiivinenKorkeus(double); double HaeArvo(); private: double m_arvo; }; Suorakaide(); void AsetaLeveys(); void AsetaKorkeus(); void LaskeAla(); private: double m_leveys; double m_korkeus; }; #endif

59 Poikkeuskäsittely- lohkot tMyn59 // Suorakaide.cpp #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; Suorakaide::negatiivinenLeveys::negatiivinenLeveys(double leveys) { cout<<"negatiivinenLeveys-luokan poikkeus, olio "<<this<<endl; m_arvo=leveys; } double Suorakaide::negatiivinenLeveys::HaeArvo() { return m_arvo; }

60 Poikkeuskäsittely- lohkot tMyn60 Suorakaide::negatiivinenKorkeus::negatiivinenKorkeus(double korkeus) { cout<<"negatiivinenKorkeus-luokan poikkeus, olio "<<this<<endl; m_arvo=korkeus; } double Suorakaide::negatiivinenKorkeus::HaeArvo() { return m_arvo; } Suorakaide::Suorakaide() { cout<<"Suorakaide-luokan oletusmuodostin, olio "<<this<<endl; m_leveys=0; m_korkeus=0; }

61 Poikkeuskäsittely- lohkot tMyn61 void Suorakaide::AsetaLeveys() { double leveys; cout<<"Anna leveys: "; cin>>leveys; cin.get(); if(leveys>=0) m_leveys=leveys; else throw negatiivinenLeveys(leveys); }

62 Poikkeuskäsittely- lohkot tMyn62 void Suorakaide::AsetaKorkeus() { double korkeus; cout<<"Anna korkeus: "; cin>>korkeus; cin.get(); if(korkeus>=0) m_korkeus=korkeus; else throw negatiivinenKorkeus(korkeus); } void Suorakaide::LaskeAla() { cout<<"Pinta-ala on "<<m_leveys*m_korkeus <<" pa-yksikk\224\204."<<endl; }

63 Poikkeuskäsittely- lohkot tMyn63 // poikkeusSuorak5Main.cpp : main project file. #include "stdafx.h" #include #include "Suorakaide.h" using namespace System; using namespace std; int main(array ^args) { Suorakaide eka=Suorakaide(); bool koetasUudelleen=true;

64 Poikkeuskäsittely- lohkot tMyn64 while(koetasUudelleen) { try { eka.AsetaLeveys(); koetasUudelleen=false; } catch (Suorakaide::negatiivinenLeveys leveys) { cout<<"Annoit arvon "<<leveys.HaeArvo() <<" suorakaiteen leveydelle."<<endl; } koetasUudelleen=true;

65 Poikkeuskäsittely- lohkot tMyn65 while(koetasUudelleen) { try { eka.AsetaKorkeus(); koetasUudelleen=false; } catch (Suorakaide::negatiivinenKorkeus korkeus) { cout<<"Annoit arvon "<<korkeus.HaeArvo() <<" suorakaiteen korkeudelle."<<endl; } eka.LaskeAla(); return 0; }

66 Poikkeuskäsittely- lohkot tMyn66

67 Poikkeuskäsittely- lohkot tMyn67 Myös UML tunnistaa sisäkkäiset luokat. Viimeisimmän esimerkkiohjelman luokkakaavio voisi näyttää seuraavan tyyliseltä, kuva 1:

68 Poikkeuskäsittely- lohkot tMyn68 Suorakaide - m_leveys: double - m_korkeus: double + Suorakaide() + AsetaLeveys(): void + AsetaKorkeus(): void + LaskeAla(): void negatiivinenKorkeus - m_arvo: double + negatiivinenKorkeus (korkeus: double) + HaeArvo(): double negatiivinenLeveys - m_arvo: double + negatiivinenLeveys (leveys: double) + HaeArvo(): double Kuva 1. UML-kaavio sisäkkäisistä luokista.


Lataa ppt "Poikkeuskäsittely- lohkot tMyn1 Poikkeuskäsittelylohkot try-catch Poikkeustilanteiden käsittelymekanismi toteutetaan varatuilla sanoilla try, throw ja."

Samankaltaiset esitykset


Iklan oleh Google