/** * * @file CException.h * * @authors M. Laporte, D. Mathieu * * @date 23/03/2010 * * @version V1.0 * * @brief classe CException * **/ #ifndef __CEXCEPTION_H__ #define __CEXCEPTION_H__ #include <string> #include <iostream> #include <exception> #include "CstCodErr.h" #include "CEditable.h" namespace nsUtil { class CException : public std::exception, public IEditable { std::string myLibelle; unsigned myCodErr; public : CException (const std::string & libelle = std::string(), const unsigned codErr = KNoExc) noexcept; virtual ~CException (void) noexcept; const std::string & getLibelle (void) const noexcept; unsigned getCodErr (void) const noexcept; virtual const char* what (void) const noexcept; protected : virtual std::ostream & display (std::ostream & os) const; }; // CException } // namespace nsUtil #endif /* __CEXCEPTION_H__ */ /** * * @file CException.cpp * * @authors M. Laporte, D. Mathieu * * @date 02/04/2010 * * @version V1.0 * * @brief classe CException * **/ #include <string> #include <iostream> #include "CstCodErr.h" #include "IEditable.hpp" #include "CException.h" using namespace std; ostream & nsUtil::CException::display (ostream & os) const { return os << "Exception : " << myLibelle << '\n' << "Code : " << myCodErr; } // display() #define CEXC nsUtil::CException CEXC::CException (const std::string & libelle /* = std::string () */, const unsigned codErr /* = KNoExc */) noexcept : myLibelle (libelle), myCodErr (codErr) {} const std::string & CEXC::getLibelle (void) const noexcept { return myLibelle; } // getLibelle() unsigned CEXC::getCodErr (void) const noexcept { return myCodErr; } CEXC::~CException (void) noexcept {} const char* CEXC::what() const noexcept { return myLibelle.c_str(); } #undef CEXC /** * * @file TestCException.cpp * * @authors D. Mathieu * * @date 17/03/2010 * * @version V2.0 * * @brief Test de la classe CException * **/ #include <iostream> #include <string> #include <esception> #include "CException.hpp" #include "CstCodErr.h" using namespace std; using namespace nsUtil; // CException namespace { class ExcFille : public CException { public : ExcFille (const string & libel, unsigned val) throw () : CException (libel, val) {} protected : virtual ostream & display (ostream & os) const { return CException::display (os) << " de la classe fille"; } // display() }; // CFille void testCException (void) { throw ExcFille ("Test du polymorphisme", 25); }// testCException () } // namespace int main (int argc, char * argv []) { if (argc != 1) { cerr << "Nombre d'arguments invalide\n" "Usage : ./TestCException\n"; return KExcArg; } try { testCException(); return KNoExc; } catch (const CException & e) { cerr << e << '\n'; return e.getCodErr(); } catch (const exception & e) { cerr << "Exception standard : " << e.what() << '\n'; return KExcStd; } catch (...) { cerr << "Exception inconnue\n"; return KExcInconnue; } } // main()