Exception-Slicing - liegt dies am generierten Copy-Konstruktor?

Ich habe gerade einen sehr subtilen Fehler in unserem Code behoben, der durch das Aufteilen einer Ausnahme verursacht wurde, und ich möchte jetzt sicherstellen, dass ich genau verstehe, was passiert ist.

Hier ist unsere Basisausnahmeklasse, eine abgeleitete Klasse und relevante Funktionen:

class Exception
{
public:
  // construction
  Exception(int code, const char* format="", ...);
  virtual ~Exception(void);

  <snip - get/set routines and print function>

protected:
private:
  int mCode;                // thrower sets this
  char mMessage[Exception::MessageLen]; // thrower says this FIXME: use String
};

class Derived : public Exception {
public:
  Derived (const char* throwerSays) : Exception(1, throwerSays) {};
};

void innercall {
  <do stuff>
  throw Derived("Bad things happened!");
}

void outercall {
  try {
    innercall();
  }
  catch(Exception& e)
  {
    printf("Exception seen here! %s %d\n", __FILE__, __LINE__);
    throw e;
  }
}

Der Fehler war natürlich, dass Outercall eine Ausnahme statt einer abgeleiteten auslöst. Mein Fehler resultierte aus höheren Versuchen im Aufrufstapel, den Abgeleiteten Fehler abzufangen.

Jetzt möchte ich nur sicherstellen, dass ich verstehe - ich glaube, dass in der Zeile 'throw e' ein neues Exception-Objekt mit einem Standard-Kopierkonstruktor erstellt wird. Ist das wirklich so?

Wenn ja, darf ich Kopierkonstruktoren für Objekte sperren, die geworfen werden? Ich würde es wirklich vorziehen, wenn dies nicht noch einmal passiert und unser Code keinen Grund hat, Exception-Objekte (von denen ich weiß) zu kopieren.

Bitte keine Kommentare zur Tatsache, dass wir unsere eigene Ausnahmehierarchie haben. Das ist ein bisschen altes Design, an dessen Korrektur ich gerade arbeite (ich mache gute Fortschritte. Ich habe die selbstgezüchtete Saitenklasse und viele der selbstgezüchteten Container losgeworden.)

UPDATE: Um klar zu sein, ich hatte den Fehler behoben (indem ich 'throw e' in 'throw' geändert hatte), bevor ich die Frage gestellt habe. Ich habe nur nach einer Bestätigung gesucht, was los ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage