Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

source: code/branches/presentation2/src/libraries/util/Exception.h @ 6387

Last change on this file since 6387 was 6373, checked in by rgrieder, 14 years ago

Added config value to disable sound entirely.
Also added InitialisationAbortedException to be used by singletons in order not to be constructed, but nicely telling the user (only for those singletons who are allowed to fail!).

  • Property svn:eol-style set to native
File size: 7.0 KB
Line 
1/*
2 *   ORXONOX - the hottest 3D action shooter ever to exist
3 *                    > www.orxonox.net <
4 *
5 *
6 *   License notice:
7 *
8 *   This program is free software; you can redistribute it and/or
9 *   modify it under the terms of the GNU General Public License
10 *   as published by the Free Software Foundation; either version 2
11 *   of the License, or (at your option) any later version.
12 *
13 *   This program is distributed in the hope that it will be useful,
14 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 *   GNU General Public License for more details.
17 *
18 *   You should have received a copy of the GNU General Public License
19 *   along with this program; if not, write to the Free Software
20 *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
21 *
22 *   Author:
23 *      Reto Grieder
24 *   Co-authors:
25 *      ...
26 *
27 */
28
29/**
30@file
31@brief
32    Declaration of facilities to handle exceptions.
33*/
34
35#ifndef _Exception_H__
36#define _Exception_H__
37
38#include "UtilPrereqs.h"
39
40#include <exception>
41#include <sstream>
42#include <string>
43#include "Debug.h"
44
45namespace orxonox
46{
47    /**
48    @brief
49        Base class for all exceptions (derived from std::exception).
50    @details
51        This class provides support for information about the file, the line
52        and the function the error occured.
53    */
54    class _UtilExport Exception : public std::exception
55    {
56    public:
57        /**
58        @brief
59            Creates the exception but doesn't yet compose the full descrption (because of the virtual functions)
60        @param description
61            Exception description as string. This message is supposed to help developers!
62        */
63        Exception(const std::string& description, unsigned int lineNumber,
64                  const char* filename, const char* functionName);
65        //! Simplified constructor with just a description. If you need more, use the other one.
66        Exception(const std::string& description);
67
68        //! Needed for compatibility with std::exception
69        virtual ~Exception() throw() { }
70        const char* what() const throw();
71
72        //! Returns a full description with type, line, file and function
73        virtual const std::string& getFullDescription() const;
74        //! Returns the string name of the exception type
75        virtual std::string        getTypeName()        const = 0;
76        //! Returns the short developer written exception
77        virtual const std::string& getDescription()     const { return this->description_; }
78        //! Returns the line number on which the exception occurred.
79        virtual const unsigned int getLineNumber()      const { return this->lineNumber_; }
80        //! Returns the function in which the exception occurred.
81        virtual const std::string& getFunctionName()    const { return this->functionName_; }
82        //! Returns the filename in which the exception occurred.
83        virtual const std::string& getFilename()        const { return this->filename_; }
84
85        /**
86        @brief
87            Retrieves information from an exception caught with "..."
88            Works for std::exception and CEGUI::Exception
89        @remarks
90            Never ever call this function without an exception in the stack!
91        */
92        static std::string handleMessage();
93
94    protected:
95        std::string description_;             //!< User typed text about why the exception occurred
96        unsigned int lineNumber_;             //!< Line on which the exception occurred
97        std::string functionName_;            //!< Function (including namespace and class) where the exception occurred
98        std::string filename_;                //!< File where the exception occurred
99        // mutable because "what()" is a const method
100        mutable std::string fullDescription_; //!< Full description with line, file and function
101    };
102
103//! Creates a new type of exception that inherits from tracker::Exception
104#define CREATE_ORXONOX_EXCEPTION(ExceptionName)                                     \
105    class ExceptionName##Exception : public Exception                               \
106    {                                                                               \
107    public:                                                                         \
108        ExceptionName##Exception(const std::string& description,                    \
109                unsigned int lineNumber, const char* filename,                      \
110                const char* functionName)                                           \
111            : Exception(description, lineNumber, filename, functionName)            \
112        { }                                                                         \
113                                                                                    \
114        ExceptionName##Exception(const std::string& description)                    \
115            : Exception(description)                                                \
116        { }                                                                         \
117                                                                                    \
118        ~ExceptionName##Exception() throw() { }                                     \
119                                                                                    \
120        std::string getTypeName() const { return #ExceptionName; }                  \
121    }
122
123    // Creates all possible exception types.
124    // If you want to add a new type, simply copy and adjust a new line here.
125#ifndef DOXYGEN_SHOULD_SKIP_THIS
126    CREATE_ORXONOX_EXCEPTION(General);
127    CREATE_ORXONOX_EXCEPTION(FileNotFound);
128    CREATE_ORXONOX_EXCEPTION(Argument);
129    CREATE_ORXONOX_EXCEPTION(PhysicsViolation);
130    CREATE_ORXONOX_EXCEPTION(ParseError);
131    CREATE_ORXONOX_EXCEPTION(PluginsNotFound);
132    CREATE_ORXONOX_EXCEPTION(InitialisationFailed);
133    CREATE_ORXONOX_EXCEPTION(InitialisationAborted);
134    CREATE_ORXONOX_EXCEPTION(NotImplemented);
135    CREATE_ORXONOX_EXCEPTION(GameState);
136    CREATE_ORXONOX_EXCEPTION(NoGraphics);
137    CREATE_ORXONOX_EXCEPTION(AbortLoading);
138#endif
139
140    /**
141    @brief
142        Helper function that forwards an exception and displays the message.
143    @details
144        This is necessary because only when using 'throw' the objects storage is managed.
145    */
146    template <class T>
147    inline const T& exceptionThrowerHelper(const T& exception)
148    {
149        // let the catcher decide whether to display the message below level 4
150        COUT(4) << exception.getFullDescription() << std::endl;
151        return exception;
152    }
153
154/**
155@brief
156    Throws an exception and logs a message beforehand.
157@param type
158    Type of the exception as literal (General, Initialisation, etc.)
159@param description
160    Exception description as string
161*/
162#define ThrowException(type, description) \
163    throw orxonox::exceptionThrowerHelper(type##Exception(static_cast<std::ostringstream&>(std::ostringstream().flush() << description).str(), __LINE__, __FILE__, __FUNCTIONNAME__))
164
165} /* namespace orxonox */
166
167#endif /* _Exception_H__ */
Note: See TracBrowser for help on using the repository browser.