ich eine Basisklasse für Ausnahmen haben:Vermeiden von Makros für nahezu identische Klassendefinitionen
class BaseException : public std::runtime_error
{
public:
BaseException(int Code, std::string Msg) : runtime_error(Msg);
//...etc
};
In jeder Klasse, die Ausnahmen braucht, binde ich eine Exception
Klasse, die von BaseException
erbt:
class Foo
{
public:
class Exception : public BaseException
{
public:
Exception(int Code, std::string OptMsg = "") : BaseException(Code, OptMsg);
enum
{
Fire,
Flood,
Aliens
};
};
//...etc
};
So Jetzt kann ich throw(Exception::Fire)
innerhalb Foo
und fangen nach Basisklasse oder durch Foo::Exception&
und zum Beispiel mit Foo::Exception::Fire
vergleichen.
Die Klassendefinition Exception
ist fast immer identisch, nur der Inhalt des Enums ändert sich. Wegen DRY, dachte ich einen Makro zu schreiben, die so etwas wie dies ermöglicht:
EXCEPTIONS
Fire,
Flood,
Aliens
END_EXCEPTIONS
Allerdings sind Makros verpönt in C++. Gibt es einen besseren Weg?
Wie lautet die Enumeration für und wie hängt sie mit den Argumenten des Konstruktors zusammen? –
Die Aufzählung beschreibt die Ausnahme beim Werfen/Fangen, fügte diese Information zu der Frage hinzu. – Unimportant
Ich denke, das ist ein Designproblem. Die Information darüber, welche Art von Ausnahmesituation aufgetreten ist, ist unterteilt in * Typ * und * Daten *. Dies scheint inkonsistent zu sein, und es ist nicht typsicher, da Sie jedem Konstruktor "int" und nicht nur gültigen enum-Werten übergeben können. Wenn ich Sie wäre, würde ich mich für einen viel einfacheren Ansatz entscheiden, indem ich entweder den Statuscode oder die BaseException-Unterklassen eliminieren würde. –