000
11.12.2009, 20:32 Uhr
0xdeadbeef
Gott (Operator)
|
Moin,
Aaalso, ich schreib ja gelegentlich mal an C++-Bibliotheken (das hab ich bestimmt schon mal erwähnt), und dabei fliegen auch mal Exceptions in der Gegend rum. Prinzipiell möchte ich natürlich, dass die von den entsprechenden Standard-Exceptions erben (meistens std::invalid_argument), aber auch, dass ich von meiner Bibliothek geschmissene Exceptions als solche identifizieren kann. Ich habe mir dazu was ausgedacht, und ich wüsste gern, was ihr von dem Ansatz haltet.
Also, das ganze sieht etwa so aus: (ml stehe für "my library")
C++: |
#ifndef INCLUDED_ML_ML_EXCEPTION_HH #define INCLUDED_ML_ML_EXCEPTION_HH
namespace ml { class ml_exception { public: virtual ~ml_exception() throw(); virtual char const *what() const throw() = 0; };
template<typename base_exception_t> class ml_exception_tag : public base_exception_t, public ml_exception { // In C++0x mit variadic templates wird das natürlich schöner template<typename init_param_t> ml_exception_tag(init_param_t const &p) : base_exception_t(p) { }
virtual ~ml_exception() throw() { }
virtual char const *what() const throw() { return base_exception_t::what(); } }; }
#endif
|
C++: |
#include "ml_exception.hh"
namespace ml { ml_exception::~ml_exception() throw() { } }
|
und soll dann so benutzt werden:
C++: |
#include "ml_exception.hh" #include <stdexcept>
namespace ml { class invalid_id : public ml_exception_tag<std::invalid_argument> { public: // ... }; }
|
Damit kann ml::invalid_id sowohl als std::invalid_argument und Basisklassen als auch als ml::ml_exception gefangen werden. Dreckiger Hack oder elegante Lösung? -- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 11.12.2009 um 20:38 Uhr von 0xdeadbeef editiert. |