Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Undantag - eng. Exceptions Viktig del av klassbiblioteksdesign “Hoppa direkt ut med felkod” class divisionMedNoll {/*...*/};... if (delaMed == 0) throw divisionMedNoll(); resultatet = taljarUttr / delaMed ;... explicit konstruktoranrop! Exceptions brukar vara klasser
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exceptions forts jämför C: #define divide_by_zero 7... if (divi == 0) return divide_by_zero ; /* else continue here */ En exception orsakar uthopp genom alla anropande funktioner tills den fångas. Om den inte fångas i programmet anropas terminate() och programmet avslutas.
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Hur man hanterar exceptions try { kompliceradDivision(x,y,z,p,k,result); } catch (divisionMedNoll) { cout << “Division med noll!”; result = 1; }
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Första catch matchar try { // kod.... } catch (divisionMedNoll) { /*...*/} catch (std::bad_alloc) {/*...*/} catch (...) { cout << “det blev nåt fel”; } Fånga specialiserade fel först och vanligaste feltyp sist för att kunna hantera på bästa sätt. (exceptions ingår ofta i arvshierarki)... tar alla exceptions
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exception specification - i snitt mot användaren void kompliceradDivision(int x, int y, int z, int p, int k, int result) throw(divisionMedNoll, forStortTal); // Garanteras att funktionen ej ger andra // exceptions extern void noProblem(int x) throw(); // noProblem garanterar: inga exceptions alls annars: unexpected() terminate()
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Exception-hantering i flera steg float meanVal() { try { /* kod */ } catch (divisionMedNoll) { cout << “Division med noll i meanVal()”; throw; // divisionMedNoll “kastas” // vidare för hantering i anropande rutin }
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Vad händer med stack,heap? stack unwind - anropsstacken plockas ner för objekt i stacken görs destruktoranrop minnesläckagerisk - om man använt “new” måste man avallokera
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Detaljer i exception-hantering 1throw skapar temporärt objekt av exception- klassen 2exception-objektet tillverkas genom att det första objektet kopieras till speciell lagringsplats –temporärobjektets statiska typ används 3temporärobjektet tas bort 4exception handler letas upp –stack unwind, destruktoranrop därför bör resurser representeras av objekt auto_ptr?!
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Detaljer i exception-hantering forts 5catch (Extype eobj) eobj exception-objektet kopieras till eobj –Om Extype är basklass till exception-objektet kopieras endast basklass-delen eventuellt rethrow skickar exception- objektet (inte eobj) vidare
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Detaljer i exception-hantering forts class Base { virtual print() throw (file_err, io_err); } class Derived { virtual print() throw (file_err); } Mer restriktiv myBaseP->print(); // i värsta fall...
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Detaljer i exception-hantering forts MyClass::MyClass(int test1, int test2) try : medlem1(test1) medlem2(test2) { /* kod */ } catch (...) { /* kod */ }
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT //exception.h namespace std { class exception { public: exception() throw(); exception(const exception &) throw (); exception& operator=(const exception &) throw(); virtual ~exception() throw(); virtual const char* what() const throw(); }
Sid period2CD5250 OOP med C++ Mats Medin MDH/IDT Predefined exception classes invalid_argument out_of_rangelength_error domain_error exception logic_errorruntime_error range_error overflow_error underflow_error bad_alloc bad_cast