Catch exceptions by reference



  • Ich lese gerade More Effective C++ und da steht, man soll exceptions by reference fangen, hier ist ein Beispielcode:

    void someFunction()                  // nothing changes in this
    {                                    // function
      ...
    
      if (a validation test fails) {
        throw Validation_error();
      }
    
      ...
    
    }
    
    void doSomething()
    {
      try {
        someFunction();                  // no change here
      }
      catch (exception& ex) {            // here we catch by reference
                                         // instead of by value
    
        cerr << ex.what();               // now calls
                                         // Validation_error::what(),
        ...                              // not exception::what()
      }
    }
    

    Was mir bei leibe nicht klar ist, wieso soll das funktionieren? Wird die exception mittels throw im scope gelassen?
    Mein Compiler meckert da auch, dass er sagt, das 'ex' eine unreferenzierte lokale variable ist



  • Klar, die Exception lebt bis der catch-Block abgearbeitet ist. Sonst würde das Fangen by-value ja auch nicht funktionieren, da beim Erstellen der Kopie das Original bereits weg wäre.

    Die unreferenzierte lokale Variable bekommst Du, wenn Du ex nicht verwendest. Das hat mit Exceptions nichts zu tun.

    Ausserdem, wenn Du immer by-value fangen würdest, würdest Du nie eine std::exception fangen können, wenn du einen std::runtime_error geworfen hast. Höchstens einen Teilausschnitt davon.



  • Exceptions werden "in eine sichere Umgebung kopiert" (steht das nicht im selben Kapitel?) und auf die bekommst Du dann eine Referenz. Die ursprüngliche wird tatsächlich abgebaut (oder "darf abgebaut werden" ? weiß gerade nicht genau)...

    Seikilos schrieb:

    ...
    ...Mein Compiler meckert da auch, dass er sagt, das 'ex' eine unreferenzierte lokale variable ist

    Hmmmm - mit dem obigen Code glaube ich das aber nicht....

    Gruß,

    Simon2.



  • Ok, nun verstehe ich.

    Danke


Anmelden zum Antworten