130 likes | 215 Views
Undantag - eng. Exceptions. Viktig del av klassbiblioteksdesign “Hoppa direkt ut med felkod” class divisionMedNoll {/*...*/}; ... if (delaMed == 0) throw divisionMedNoll(); resultatet = taljarUttr / delaMed ;. Exceptions brukar vara klasser. explicit konstruktoranrop!.
E N D
Undantag - eng. Exceptions Viktig del av klassbiblioteksdesign • “Hoppa direkt ut med felkod” class divisionMedNoll {/*...*/}; ... if (delaMed == 0) throw divisionMedNoll(); resultatet = taljarUttr / delaMed ; ... Exceptions brukar vara klasser explicit konstruktoranrop! CD5250 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. CD5250 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; } CD5250 OOP med C++ Mats Medin MDH/IDT
Första catch matchar 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) try { // kod.... } catch (divisionMedNoll) { /*...*/} catch (std::bad_alloc) {/*...*/} catch (...) { cout << “det blev nåt fel”; } ... tar alla exceptions CD5250 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() CD5250 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 } CD5250 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 CD5250 OOP med C++ Mats Medin MDH/IDT
Detaljer i exception-hantering • throw skapar temporärt objekt av exception-klassen • exception-objektet tillverkas genom att det första objektet kopieras till speciell lagringsplats • temporärobjektets statiska typ används • temporärobjektet tas bort • exception handler letas upp • stack unwind, destruktoranrop auto_ptr?! därför bör resurser representeras av objekt CD5250 OOP med C++ Mats Medin MDH/IDT
Detaljer i exception-hantering forts • catch (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 CD5250 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... CD5250 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 */ } CD5250 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(); } } CD5250 OOP med C++ Mats Medin MDH/IDT
Predefined exception classes exception bad_cast logic_error runtime_error bad_alloc out_of_range length_error range_error invalid_argument domain_error overflow_error underflow_error CD5250 OOP med C++ Mats Medin MDH/IDT