// cppexc2.cpp - Esimerkki virheenhallinnasta poikkeuksilla (väärin tehtynä) // - tulosta metodit "tekeleet" jää siivoamatta // Perustuu Vesa Lappalaisen kirjoittamaan aku.cpp:hen // Antti-Juhani Kaijanaho, 2001-03-21 // Muutokset: Vesa Lappalainen 20.3.2002 // + ei saman numeron toistoa #include #include #include using std::cout; using std::ios; using std::string; using std::ostream; using std::setw; using std::endl; /* Tämä poikkeusluokka ei tarvitse mitään metodeita tai * attribuutteja. */ class cOutoArvosana {}; /* Muuttaa parametrina annetun arvosanan sanalliseksi. Jos arvosana * on mahdoton, heitetään poikkeus. */ string arvostelu_sanana(double arvo) { if ( arvo < 4 || 10 < arvo ) throw cOutoArvosana(); if ( arvo <= 4.5) return "hylätty"; if ( arvo < 7 ) return "välttävä"; if ( arvo < 9 ) return "tyydyttävä"; return "erinomainen"; } class cOppilas { string nimi; double keskiarvo; public: cOppilas(const string &animi, double arvo = 4) : nimi(animi), keskiarvo(arvo) {} void tulosta(ostream &os=cout) const; }; void cOppilas::tulosta(ostream &os) const { long oldf = os.setf(ios::showpoint | ios::fixed | ios::left); int oldp = os.precision(2); os << setw(22) << nimi; os.setf(ios::right); os << " keskiarvo: " << setw(5) << keskiarvo << endl; string sanana = arvostelu_sanana(keskiarvo); os << " sanoina: " << sanana << endl; os << endl; os.flags(oldf); os.precision(oldp); } int main() { cOppilas aku("Ankka Aku",5.0); cOppilas mikki("Hiiri Mikki",9.0); cOppilas tosi_outo("Tosi Outo", 3.5); try { cout << setw(5) << 5.6 << endl; aku.tulosta(); cout << setw(5) << 5.6 << endl; tosi_outo.tulosta(); cout << setw(5) << 5.6 << endl; mikki.tulosta(); cout << setw(5) << 5.6 << endl; } catch (cOutoArvosana) { cout << setw(5) << 5.6 << endl; cout << "Virheellinen arvosana!" << endl; return 1; } return 0; }