1 / 13

Undantag - eng. Exceptions

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!.

nasya
Télécharger la présentation

Undantag - eng. Exceptions

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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

  2. 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

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  11. 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

  12. //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

  13. 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

More Related