OgreException.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2006 Torus Knot Software Ltd
00008 Also see acknowledgements in Readme.html
00009 
00010 This program is free software; you can redistribute it and/or modify it under
00011 the terms of the GNU Lesser General Public License as published by the Free Software
00012 Foundation; either version 2 of the License, or (at your option) any later
00013 version.
00014 
00015 This program is distributed in the hope that it will be useful, but WITHOUT
00016 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00017 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
00018 
00019 You should have received a copy of the GNU Lesser General Public License along with
00020 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
00021 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
00022 http://www.gnu.org/copyleft/lesser.txt.
00023 
00024 You may alternatively use this source under the terms of a specific version of
00025 the OGRE Unrestricted License provided you have obtained such a license from
00026 Torus Knot Software Ltd.
00027 -----------------------------------------------------------------------------
00028 */
00029 #ifndef __Exception_H_
00030 #define __Exception_H_
00031 
00032 // Precompiler options
00033 #include "OgrePrerequisites.h"
00034 #include "OgreString.h"
00035 #include <exception>
00036 
00037 // Backwards compatibility with old assert mode definitions
00038 #if OGRE_RELEASE_ASSERT == 1
00039 #   define OGRE_ASSERT_MODE 1
00040 #endif
00041 
00042 // Check for OGRE assert mode
00043 
00044 // RELEASE_EXCEPTIONS mode
00045 #if OGRE_ASSERT_MODE == 1
00046 #   ifdef _DEBUG
00047 #       define OgreAssert( a, b ) assert( (a) && (b) )
00048 
00049 #   else
00050 #       if OGRE_COMP != OGRE_COMPILER_BORL
00051 #           define OgreAssert( a, b ) if( !(a) ) OGRE_EXCEPT( Ogre::Exception::ERR_RT_ASSERTION_FAILED, (b), "no function info")
00052 #       else
00053 #           define OgreAssert( a, b ) if( !(a) ) OGRE_EXCEPT( Ogre::Exception::ERR_RT_ASSERTION_FAILED, (b), __FUNC__ )
00054 #       endif
00055 
00056 #   endif
00057 
00058 // EXCEPTIONS mode
00059 #elif OGRE_ASSERT_MODE == 2
00060 #   if OGRE_COMP != OGRE_COMPILER_BORL
00061 #       define OgreAssert( a, b ) if( !(a) ) OGRE_EXCEPT( Ogre::Exception::ERR_RT_ASSERTION_FAILED, (b), "no function info")
00062 #   else
00063 #       define OgreAssert( a, b ) if( !(a) ) OGRE_EXCEPT( Ogre::Exception::ERR_RT_ASSERTION_FAILED, (b), __FUNC__ )
00064 #   endif
00065 
00066 // STANDARD mode
00067 #else
00068 #   define OgreAssert( a, b ) assert( (a) && (b) )
00069 
00070 #endif
00071 
00072 namespace Ogre {
00086     class _OgreExport Exception : public std::exception
00087     {
00088     protected:
00089         long line;
00090         int number;
00091         String typeName;
00092         String description;
00093         String source;
00094         String file;
00095         mutable String fullDesc;
00096     public:
00102         enum ExceptionCodes {
00103             ERR_CANNOT_WRITE_TO_FILE,
00104             ERR_INVALID_STATE,
00105             ERR_INVALIDPARAMS,
00106             ERR_RENDERINGAPI_ERROR,
00107             ERR_DUPLICATE_ITEM,
00108             ERR_ITEM_NOT_FOUND,
00109             ERR_FILE_NOT_FOUND,
00110             ERR_INTERNAL_ERROR,
00111             ERR_RT_ASSERTION_FAILED, 
00112             ERR_NOT_IMPLEMENTED
00113         };
00114 
00117         Exception( int number, const String& description, const String& source );
00118 
00121         Exception( int number, const String& description, const String& source, const char* type, const char* file, long line );
00122 
00125         Exception(const Exception& rhs);
00126 
00128         ~Exception() throw() {}
00129 
00132         void operator = (const Exception& rhs);
00133 
00144         virtual const String& getFullDescription(void) const;
00145 
00148         virtual int getNumber(void) const throw();
00149 
00152         virtual const String &getSource() const { return source; }
00153 
00156         virtual const String &getFile() const { return file; }
00157 
00160         virtual long getLine() const { return line; }
00161 
00166         virtual const String &getDescription(void) const { return description; }
00167 
00169         const char* what() const throw() { return getFullDescription().c_str(); }
00170         
00171     };
00172 
00173 
00180     template <int num>
00181     struct ExceptionCodeType
00182     {
00183         enum { number = num };
00184     };
00185 
00186     // Specialised exceptions allowing each to be caught specifically
00187     // backwards-compatible since exception codes still used
00188 
00189     class _OgreExport UnimplementedException : public Exception 
00190     {
00191     public:
00192         UnimplementedException(int number, const String& description, const String& source, const char* file, long line)
00193             : Exception(number, description, source, "UnimplementedException", file, line) {}
00194     };
00195     class _OgreExport FileNotFoundException : public Exception
00196     {
00197     public:
00198         FileNotFoundException(int number, const String& description, const String& source, const char* file, long line)
00199             : Exception(number, description, source, "FileNotFoundException", file, line) {}
00200     };
00201     class _OgreExport IOException : public Exception
00202     {
00203     public:
00204         IOException(int number, const String& description, const String& source, const char* file, long line)
00205             : Exception(number, description, source, "IOException", file, line) {}
00206     };
00207     class _OgreExport InvalidStateException : public Exception
00208     {
00209     public:
00210         InvalidStateException(int number, const String& description, const String& source, const char* file, long line)
00211             : Exception(number, description, source, "InvalidStateException", file, line) {}
00212     };
00213     class _OgreExport InvalidParametersException : public Exception
00214     {
00215     public:
00216         InvalidParametersException(int number, const String& description, const String& source, const char* file, long line)
00217             : Exception(number, description, source, "InvalidParametersException", file, line) {}
00218     };
00219     class _OgreExport ItemIdentityException : public Exception
00220     {
00221     public:
00222         ItemIdentityException(int number, const String& description, const String& source, const char* file, long line)
00223             : Exception(number, description, source, "ItemIdentityException", file, line) {}
00224     };
00225     class _OgreExport InternalErrorException : public Exception
00226     {
00227     public:
00228         InternalErrorException(int number, const String& description, const String& source, const char* file, long line)
00229             : Exception(number, description, source, "InternalErrorException", file, line) {}
00230     };
00231     class _OgreExport RenderingAPIException : public Exception
00232     {
00233     public:
00234         RenderingAPIException(int number, const String& description, const String& source, const char* file, long line)
00235             : Exception(number, description, source, "RenderingAPIException", file, line) {}
00236     };
00237     class _OgreExport RuntimeAssertionException : public Exception
00238     {
00239     public:
00240         RuntimeAssertionException(int number, const String& description, const String& source, const char* file, long line)
00241             : Exception(number, description, source, "RuntimeAssertionException", file, line) {}
00242     };
00243 
00244 
00254     class ExceptionFactory
00255     {
00256     private:
00258         ExceptionFactory() {}
00259     public:
00260         static UnimplementedException create(
00261             ExceptionCodeType<Exception::ERR_NOT_IMPLEMENTED> code, 
00262             const String& desc, 
00263             const String& src, const char* file, long line)
00264         {
00265             return UnimplementedException(code.number, desc, src, file, line);
00266         }
00267         static FileNotFoundException create(
00268             ExceptionCodeType<Exception::ERR_FILE_NOT_FOUND> code, 
00269             const String& desc, 
00270             const String& src, const char* file, long line)
00271         {
00272             return FileNotFoundException(code.number, desc, src, file, line);
00273         }
00274         static IOException create(
00275             ExceptionCodeType<Exception::ERR_CANNOT_WRITE_TO_FILE> code, 
00276             const String& desc, 
00277             const String& src, const char* file, long line)
00278         {
00279             return IOException(code.number, desc, src, file, line);
00280         }
00281         static InvalidStateException create(
00282             ExceptionCodeType<Exception::ERR_INVALID_STATE> code, 
00283             const String& desc, 
00284             const String& src, const char* file, long line)
00285         {
00286             return InvalidStateException(code.number, desc, src, file, line);
00287         }
00288         static InvalidParametersException create(
00289             ExceptionCodeType<Exception::ERR_INVALIDPARAMS> code, 
00290             const String& desc, 
00291             const String& src, const char* file, long line)
00292         {
00293             return InvalidParametersException(code.number, desc, src, file, line);
00294         }
00295         static ItemIdentityException create(
00296             ExceptionCodeType<Exception::ERR_ITEM_NOT_FOUND> code, 
00297             const String& desc, 
00298             const String& src, const char* file, long line)
00299         {
00300             return ItemIdentityException(code.number, desc, src, file, line);
00301         }
00302         static ItemIdentityException create(
00303             ExceptionCodeType<Exception::ERR_DUPLICATE_ITEM> code, 
00304             const String& desc, 
00305             const String& src, const char* file, long line)
00306         {
00307             return ItemIdentityException(code.number, desc, src, file, line);
00308         }
00309         static InternalErrorException create(
00310             ExceptionCodeType<Exception::ERR_INTERNAL_ERROR> code, 
00311             const String& desc, 
00312             const String& src, const char* file, long line)
00313         {
00314             return InternalErrorException(code.number, desc, src, file, line);
00315         }
00316         static RenderingAPIException create(
00317             ExceptionCodeType<Exception::ERR_RENDERINGAPI_ERROR> code, 
00318             const String& desc, 
00319             const String& src, const char* file, long line)
00320         {
00321             return RenderingAPIException(code.number, desc, src, file, line);
00322         }
00323         static RuntimeAssertionException create(
00324             ExceptionCodeType<Exception::ERR_RT_ASSERTION_FAILED> code, 
00325             const String& desc, 
00326             const String& src, const char* file, long line)
00327         {
00328             return RuntimeAssertionException(code.number, desc, src, file, line);
00329         }
00330 
00331     };
00332     
00333 
00334     
00335 #ifndef OGRE_EXCEPT
00336 #define OGRE_EXCEPT(num, desc, src) throw Ogre::ExceptionFactory::create( \
00337     Ogre::ExceptionCodeType<num>(), desc, src, __FILE__, __LINE__ );
00338 #endif
00339 
00340 } // Namespace Ogre
00341 #endif

Copyright © 2008 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.
Last modified Sun Sep 27 22:02:23 2009