]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/except.h
Don't throw on win32 if file has no owner or group
[libs/core.git] / source / core / except.h
index d030c41c12937e1a3846ce819c445cd2b953e308..ed295f11cef6c50d7fb1c407a7c89852e2d8b2b6 100644 (file)
@@ -1,15 +1,9 @@
-/* $Id$
-
-This file is part of libmspcore
-Copyright © 2006-2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
 #ifndef MSP_CORE_ERROR_H_
 #define MSP_CORE_ERROR_H_
 
 #include <exception>
 #include <string>
-#include "../debug/backtrace.h"
+#include <msp/debug/backtrace.h>
 
 namespace Msp {
 
@@ -18,16 +12,19 @@ Base class for all Msp exceptions.
 */
 class Exception: public std::exception
 {
+private:
+       std::string wot;
+       std::string wer;
+       Debug::Backtrace bt;
+
 public:
        Exception(const std::string &);
        ~Exception() throw() { }
 
-       const char *what() const throw() { return w.c_str(); }
+       const char *what() const throw() { return wot.c_str(); }
+       Exception &at(const std::string &) throw();
+       const char *where() const throw() { return wer.c_str(); }
        const Debug::Backtrace &get_backtrace() const throw() { return bt; }
-private:
-       std::string w;
-       Debug::Backtrace bt;
-
 };
 
 /**
@@ -44,8 +41,15 @@ Thrown when a lookup from a map fails.
 */
 class KeyError: public Exception
 {
+private:
+       std::string key;
+
 public:
        KeyError(const std::string &w_): Exception(w_) { }
+       KeyError(const std::string &w_, const std::string &k);
+       ~KeyError() throw() { }
+
+       const std::string &get_key() const { return key; }
 };
 
 /**
@@ -62,11 +66,12 @@ Thrown when the application is invoked with wrong parameters.
 */
 class UsageError: public Exception
 {
-public:
-       UsageError(const std::string &r, bool b=true): Exception(r), brief(b) { }
-       bool get_brief() const { return brief; }
 private:
        bool brief;
+
+public:
+       UsageError(const std::string &r, bool b = true): Exception(r), brief(b) { }
+       bool get_brief() const { return brief; }
 };
 
 /**
@@ -74,15 +79,30 @@ Thrown when a system call fails.
 */
 class SystemError: public Exception
 {
+private:
+       int err;
+
 public:
        SystemError(const std::string &, int);
        int get_error_code() const { return err; }
-private:
-       int err;
 
+private:
        static std::string build_what(const std::string &, int);
 };
 
+/**
+Thrown when "impossible" things happen.
+*/
+class LogicError: public Exception
+{
+public:
+       LogicError(const std::string &w_): Exception(w_) { }
+};
+
+template<typename E>
+void throw_at(E e, const std::string &a)
+{ e.at(a); throw e; }
+
 } // namespace Msp
 
 #endif