812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Samankaltaiset tiedostot
Olio-ohjelmointi Poikkeusten käsittelystä. 1. Johdanto

815338A Ohjelmointikielten periaatteet

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Ohjelman virheet ja poikkeusten käsittely

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Poikkeustenkäsittely

5/20: Algoritmirakenteita III

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

1. Omat operaatiot 1.1

Periytymisen käyttö C++:ssa

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Olio-ohjelmointi Virhetilanteiden käsittely

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Mitä poikkeuskäsittely tarkoittaa?

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmoinnin perusteet Y Python

Osoitin ja viittaus C++:ssa

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

Tehtävä 1. TL5302 Olio-ohjelmointi Koe Malliratkaisuja. Tässä sekä a)- että b)-kohdan toimiva ratkaisu:

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

1. Mitä tehdään ensiksi?

ITKP102 Ohjelmointi 1 (6 op)

8. Näppäimistöltä lukeminen 8.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Olio-ohjelmointi Syntaksikokoelma

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

12. Näppäimistöltä lukeminen 12.1

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

7. Oliot ja viitteet 7.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Metodien tekeminen Javalla

Sisältö. 2. Taulukot. Yleistä. Yleistä

12 Mallit (Templates)

ITKP102 Ohjelmointi 1 (6 op)

24. oppitunti VII. Poikkeukset ja virheiden käsittely. Osa

8. Näppäimistöltä lukeminen 8.1

Olio-ohjelmointi Javalla

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

C++11 lambdat: [](){} Matti Rintala

Poikkeusten ja tapahtumien käsittely

Kääntäjän virheilmoituksia

4. Luokan testaus ja käyttö olion kautta 4.1

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

13 Operaattoreiden ylimäärittelyjä

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Taulukot. Jukka Harju, Jukka Juslin

15. Ohjelmoinnin tekniikkaa 15.1

Poikkeusten käsittely

19. Olio-ohjelmointia Javalla 19.1

Olio-ohjelmointi 2. välikoe HYV5SN

Java-kielen perusteet

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Muuttujat ja kontrolli. Ville Sundberg

Rajapinta (interface)

15. Ohjelmoinnin tekniikkaa 15.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Virtuaalifunktiot ja polymorfismi

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Metodit Arvotyyppi. Metodit Arvotyyppi. Metodit Parametrit. Metodit Parametrit. Metodit Kuormittaminen. Metodit Kuormittaminen. Javan perusteet

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Mallit standardi mallikirjasto parametroitu tyyppi

ITKP102 Ohjelmointi 1 (6 op)

11/20: Konepelti auki

Osa III. Olioiden luominen vapaalle muistialueelle

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

Java-kielen perusteet

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Java-kielen perusteita

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Mikä yhteyssuhde on?

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

4. Olio-ohjelmoinista lyhyesti 4.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Muuttujien roolit Kiintoarvo cin >> r;

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

1 Tehtävän kuvaus ja analysointi

Transkriptio:

812347A Olio-ohjelmointi, 2015 syksy 2. vsk X Poikkeusten käsittelystä

Sisältö 1. Yleistä poikkeusten käsittelystä 2. Poikkeuskäsittelyn perusteita C++:ssa 3. Standardissa määritellyt poikkeukset 4. Poikkeusvarmuus käsittelystä 2

X.1. Yleistä poikkeusten käsittelystä Poikkeukset (exception) ovat ohjelman suorituksenaikaisia poikkeustapauksia, jotka vaativat välitöntä käsittelyä, kuten dynaamisen muistin loppuminen Poikkeuksien avulla voidaan välittää virhetilanne virheen syntypaikasta paikkaan, jossa on tarvittavat voimavarat virheen käsittelemiseen Saadaan selvempää ja lyhyempää koodia Soveltuu erityisesti laajoihin ohjelmiin käsittelystä 3

X.1.1 Poikkeusten käsittelyn pääkomponentit Ohjelmanosa, jossa poikkeus tapahtuu Havaitaan poikkeama ja aiheutetaan poikkeus (raise) Keskeytetään normaali ohjelmansuoritus, kunnes poikkeus käsitelty C++:ssa poikkeus aiheutetaan (heitetään) throwlausekkeella Ohjelmanosa, jossa poikkeus käsitellään Käsittelijän löytämiseksi noustaan ohjelman kutsupinossa Kun poikkeus on käsitelty, ohjelman suoritus jatkuu normaalisti käsittelylohkon jälkeisestä lauseesta C++:ssa poikkeuksen käsittely toteutetaan (poikkeus siepataan) catch-lauseella käsittelystä 4

X.1.2 Standardissa määritellyistä poikkeustapauksista new-operaattorin kutsussa, jos ei ole saatavilla muistia STL:n säiliöiden käsittelyssä erilaisia poikkeuksia mm. Indeksirajojen ylittäminen jäsenfunktioiden kutsuissa Muistin loppuminen IOStream-kirjastoa käytettäessä, jos vuot asetettu käyttämään poikkeusten käsittelyä Poikkeusta ei aiheuteta Indeksirajojen ylittämisessä käytettäessä operaattoria [] sisäisille taulukoille tai STL:n säiliöille Tiedoston avauksen epäonnistuessa tai tiedoston loppuessa sitä luettaessa käsittelystä 5

X.2. Poikkeuskäsittelyn perusteita C++:ssa C++ poikkeuskäsittelyn peruselementit: 1. try-lohko, jonka sisällä tapahtuvat poikkeukset 2. throw-lause, joka aiheuttaa poikkeuksen 3. catch-lohkot, jotka käsittelevät poikkeukset Poikkeuksen tapahduttua käydään lävitse kutsupino, kunnes poikkeusta vastaava poikkeuskäsittelijä löytyy ja samalla vapautetaan automaattisesti paikalliset muuttujat (ei staattiset, ei globaalit, ei kekodynaamiset) Jos poikkeusta ei käsitellä missään vaiheessa, poikkeus välittyy käyttöjärjestelmälle Ohjelma kaatuu Jos poikkeus olion muodostimessa, oliota ei muodosteta käsittelystä 6

X.2.1 Poikkeuksen aiheuttaminen C++:n poikkeus aiheutetaan throw-lauseella Poikkeuksen tyyppi voi olla mikä tahansa määritelty tyyppi myös sisäinen kuten int, char* Poikkeuksen ei tarvitse periytyä tietystä kantaluokasta (kuten Javassa) Funktion ei tarvitse ilmoittaa määrittelyn yhteydessä mitä poikkeuksia se aiheuttaa Jokainen funktio tai luokan jäsenfunktio voi aiheuttaa minkä tahansa poikkeuksen tahansa milloin tahansa käsittelystä 7

X.2.2 try-lohko try-lohkoon voidaan liittää poikkeuksen käsittelijä try-lohkossa olevat lausekkeiden aiheuttamat poikkeukset joko Käsitellään try-lohkon yhteydessä määritellyssä käsittelijässä Välitetään kutsuvalle funktiolle try-lohkoon liittyy vähintään yksi käsittelijä käsittelystä 8

X.2.3 catch-lohko catch-lohkolla määritellään poikkeuskäsittelijä catch-lohkon määrittely catch (std::bad_alloc &ba) { Poikkeuksen tyyppi ja muuttujamääritys // muisti loppunut: käsittele Varsinainen lohko catch - lohkot käsitellään siinä järjestyksessä kuin ne on määritelty käsittelystä 9

X.2.4 Poikkeuksen sitominen käsittelijään Jos heitetty poikkeus on tyyppiä E ja catch-lohkon parametri on tyyppiä X, niin lohko käsittelee poikkeuksen, jos 1. X on samaa tyyppiä kuin E 2. X on luokan E yksikäsitteinen julkinen kantaluokka 3. X ja E ovat osoitintyyppejä, joiden tarkoitetyypeille pätee 1 tai 2 4. X on viite, jonka tarkoitetyypille pätee 1 tai 2 käsittelystä 10

Esimerkki I int main() { try { f(); // voi aiheuttaa minkä tahansa // poikkeuksen catch (std::bad_alloc &ba) { // muisti loppunut käsittelystä 11

Esimerkki II class IkaPoikkeus {; class IkaKuukausiVirheellinenPoikkeus : public IkaPoikkeus {; class IkaVuosiVirheellinenPoikkeus : public IkaPoikkeus {; class IkaPaivaVirheellinenPoikkeus : public IkaPoikkeus {; class Ika{ public: Ika(int paivia, int kuukausia, int vuosia); private: void calculatejd(long diff); unsigned long jddays; ; käsittelystä 12

Esimerkki II (2) Ika::Ika(int paivia, int kuukausia, int vuosia){ if (paivia < 0) throw IkaPaivaVirheellinenPoikkeus(); if (kuukausia < 0) throw IkaKuukausiVirheellinenPoikkeus(); if (vuosia < 0) throw IkaVuosiVirheellinenPoikkeus(); käsittelystä 13

Esimerkki II (3) int main(){ int pv,kk, v; do { cin.clear(); cin.ignore(1000,'\n'); cout << Anna ikä pv, kk, v << endl; cin >> pv >> kk >> v; while (cin.fail()); try{ Ika ika(pv, kk, v); catch (IkaPoikkeus& p){ cout << jokin parametri virheellinen ; return 0; käsittelystä 14

X.2.5 Yleinen poikkeuskäsittelijä Yleinen poikkeuskäsittelijä ottaa kiinni kaikki poikkeukset Sen muoto on catch ( ) Lohkossa ei voida tarkemmin tietää, mikä poikkeus on tapahtunut Jos määritellään, niin määriteltävä viimeisenä käsittelystä 15

Esimerkki int main() { try { f(); catch (...) { cout << Jokin poikkeus tapahtui << endl; cout << Ohjelman suoritus lopetetaan << endl; return 0; käsittelystä 16

X.3. Standardissa määritellyt poikkeukset Määritelty otsikkotiedostoissa new, exception ja stdexcept exception bad_exception bad_cast bad_alloc ios_base::failure exception... logical_error domain_error invalid_argument length_error out_of_range runtime_error range_error overflow_error underflow_error käsittelystä 17

X.4. Poikkeusvarmuus (Exception Safety) Poikkeustenkäsittelyä pidetään joskus virheellisesti suorasukaisena keinona lisätä luotettava virheiden käsittely ohjelmiin Poikkeusten käsittelyn lisääminen ohjelmaan voi Heikentää ohjelmien luotettavuutta Hankaloittaa ohjelmistokehitysprosessia Poikkeustenkäsittelyn ohjelmoinnissa hankalinta on kirjoittaa ohjelmistokoodi siten, että yksittäinen poikkeus voi välittyä throw kohdasta sen käsittelijälle luotettavasti, rikkomatta muita osia ohjelmasta siirtymisen aikana käsittelystä 18