Fixed bug (found by cax): when building MatLab MEX files, GMP libraries were not...
[libdai.git] / include / dai / exceptions.h
index b52ac27..2f4e7b0 100644 (file)
@@ -1,11 +1,8 @@
 /*  This file is part of libDAI - http://www.libdai.org/
  *
- *  libDAI is licensed under the terms of the GNU General Public License version
- *  2, or (at your option) any later version. libDAI is distributed without any
- *  warranty. See the file COPYING for more details.
+ *  Copyright (c) 2006-2011, The libDAI authors. All rights reserved.
  *
- *  Copyright (C) 2006-2010  Joris Mooij  [joris dot mooij at libdai dot org]
- *  Copyright (C) 2006-2007  Radboud University Nijmegen, The Netherlands
+ *  Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
  */
 
 
@@ -39,7 +36,7 @@
  *  DAI_THROW(NOT_IMPLEMENTED);
  *  \endcode
  */
-#define DAI_THROW(cod) throw dai::Exception(dai::Exception::cod, std::string(__FILE__ ", line " DAI_TOSTRING(__LINE__)))
+#define DAI_THROW(cod) throw dai::Exception(dai::Exception::cod, __FILE__, __PRETTY_FUNCTION__, DAI_TOSTRING(__LINE__), "")
 
 /// Macro that simplifies throwing an exception with a user-defined error message.
 /** \param cod Corresponds to one of the enum values of dai::Exception::Code
@@ -50,7 +47,7 @@
  *  DAI_THROWE(NOT_IMPLEMENTED,"Detailed error message");
  *  \endcode
  */
-#define DAI_THROWE(cod,msg) throw dai::Exception(dai::Exception::cod, std::string(__FILE__ ", line " DAI_TOSTRING(__LINE__)), msg)
+#define DAI_THROWE(cod,msg) throw dai::Exception(dai::Exception::cod, __FILE__, __PRETTY_FUNCTION__, DAI_TOSTRING(__LINE__), msg)
 
 /// Assertion mechanism, similar to the standard assert() macro. It is always active, even if NDEBUG is defined
 #define DAI_ASSERT(condition) ((condition) ? ((void)0) : DAI_THROWE(ASSERTION_FAILED, std::string("Assertion \"" #condition "\" failed")))
@@ -98,24 +95,58 @@ class Exception : public std::runtime_error {
                    FACTORGRAPH_NOT_CONNECTED,
                    INTERNAL_ERROR,
                    RUNTIME_ERROR,
+                   OUT_OF_MEMORY,
                    NUM_ERRORS};  // NUM_ERRORS should be the last entry
 
         /// Constructor
-        Exception( Code _code, const std::string& msg="", const std::string& detailedMsg="" ) : std::runtime_error(ErrorStrings[_code] + " [" +  msg + "]"), errorcode(_code) {
-            if( !detailedMsg.empty() )
-                std::cerr << "ERROR: " << detailedMsg << std::endl;
-        }
+        Exception( Code code, const char *filename, const char *function, const char *line, const std::string& detailedMsg ) :
+            std::runtime_error(ErrorStrings[code] + (detailedMsg.empty() ? "" : (": " + detailedMsg)) + " [File " + filename + ", line " + line + ", function: " + function + "]"), 
+            _errorcode(code), _detailedMsg(detailedMsg), _filename(filename), _function(function), _line(line) {}
+
+        /// Destructor
+        ~Exception() throw () {}
 
         /// Returns error code of this exception
-        Code code() const { return errorcode; }
+        Code getCode() const { return _errorcode; }
 
-        /// Returns error message corresponding to an error code
-        const std::string &message( const Code c ) const { return ErrorStrings[c]; }
+        /// Returns error code of this exception
+        /** \deprecated Please use dai::Exceptions::getCode() instead
+         */
+        Code code() const { return getCode(); }
+
+        /// Returns short error message of this exception
+        const std::string& getMsg() const { return ErrorStrings[_errorcode]; }
+
+        /// Returns detailed error message of this exception
+        const std::string& getDetailedMsg() const { return _detailedMsg; }
+
+        /// Returns filename where this exception was thrown
+        const std::string& getFilename() const { return _filename; }
 
+        /// Returns function name in which this exception was thrown
+        const std::string& getFunction() const { return _function; }
+
+        /// Returns line number where this exception was thrown
+        const std::string& getLine() const { return _line; }
+
+        /// Returns error message corresponding to an error code
+        const std::string& message( const Code c ) const { return ErrorStrings[c]; }
 
     private:
         /// Contains the error code of this exception
-        Code errorcode;
+        Code _errorcode;
+
+        /// Contains the detailed message of this exception, if any
+        std::string _detailedMsg;
+        
+        /// Contains the filename where this exception was thrown
+        std::string _filename;
+
+        /// Contains the function name in which this exception was thrown
+        std::string _function;
+
+        /// Contains the line number where this exception was thrown
+        std::string _line;
 
         /// Error messages corresponding to the exceptions enumerated above
         static std::string ErrorStrings[NUM_ERRORS];