00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _SK_UTIL_EXCEPTION_
00010 #define _SK_UTIL_EXCEPTION_
00011
00012 #include <sk/util/Object.h>
00013 #include <sk/util/String.h>
00014 #include <exception>
00015
00016 namespace sk {
00017 namespace util {
00018 class Exception
00019 : public std::exception,
00020 public virtual sk::util::Object
00021 {
00022 public:
00023 Exception(const util::String& message);
00024 virtual ~Exception() throw();
00025
00026 const sk::util::String getMessage() const;
00027
00028
00029 const sk::util::Class getClass() const;
00030
00031
00032 const char* what() const throw();
00033
00034 template<typename S, typename T, typename TMF>
00035 static void guard(const S& stream, T& target, TMF method, const char* spot = 0);
00036
00037 protected:
00038 const String join(const String& s1, const String& s2) const;
00039 const String join(const String& s1, int i1) const;
00040
00041 private:
00042 sk::util::String _message;
00043 };
00044 }
00045 }
00046
00047 template<typename S, typename T, typename TMF>
00048 void
00049 sk::util::Exception::
00050 guard(const S& stream, T& target, TMF method, const char* spot)
00051 {
00052 try {
00053 (target.*method)();
00054 }
00055 catch(const std::exception& exception) {
00056 if(spot != 0) {
00057 stream << spot << ": ";
00058 }
00059 stream << exception.what();
00060 }
00061 catch(...) {
00062 if(spot != 0) {
00063 stream << spot << ": ";
00064 }
00065 stream << "Unknown exception";
00066 }
00067 }
00068
00069 #endif