ErrorMacros.hpp
1 /*
2  Copyright 2013 Andreas Lauser
3  Copyright 2009, 2010 SINTEF ICT, Applied Mathematics.
4  Copyright 2009, 2010 Statoil ASA.
5 
6  This file is part of the Open Porous Media project (OPM).
7 
8  OPM is free software: you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation, either version 3 of the License, or
11  (at your option) any later version.
12 
13  OPM 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 OPM. If not, see <http://www.gnu.org/licenses/>.
20 */
21 #ifndef OPM_GRID_ERRORMACROS_HEADER_INCLUDED
22 #define OPM_GRID_ERRORMACROS_HEADER_INCLUDED
23 
24 // if we have the parser we also have opm-common
25 #if HAVE_OPM_PARSER
26 #include <opm/common/ErrorMacros.hpp>
27 #else
28 
29 // reimplementation of OPM macro when opm-common is not present
30 
31 #include <string>
32 #include <sstream>
33 #include <exception>
34 #include <stdexcept>
35 #include <cassert>
36 
37 // macros for reporting to stderr
38 #ifdef OPM_VERBOSE // Verbose mode
39 # include <iostream>
40 # define OPM_REPORT do { std::cerr << "[" << __FILE__ << ":" << __LINE__ << "] " } while (false)
41 # define OPM_MESSAGE(x) do { OPM_REPORT; std::cerr << x << "\n"; } while (false)
42 # define OPM_MESSAGE_IF(cond, m) do {if(cond) OPM_MESSAGE(m);} while (false)
43 #else // non-verbose mode (default)
44 # define OPM_REPORT do {} while (false)
45 # define OPM_MESSAGE(x) do {} while (false)
46 # define OPM_MESSAGE_IF(cond, m) do {} while (false)
47 #endif
48 
49 // Macro to throw an exception. NOTE: For this macro to work, the
50 // exception class must exhibit a constructor with the signature
51 // (const std::string &message). Since this condition is not fulfilled
52 // for the std::exception, you should use this macro with some
53 // exception class derived from either std::logic_error or
54 // std::runtime_error.
55 //
56 // Usage: OPM_THROW(ExceptionClass, "Error message " << value);
57 #define OPM_THROW(Exception, message) \
58  do { \
59  std::ostringstream oss__; \
60  oss__ << "[" << __FILE__ << ":" << __LINE__ << "] " << message; \
61  throw Exception(oss__.str()); \
62  } while (false)
63 
64 // Same as OPM_THROW, except for not making an OpmLog::error() call.
65 //
66 // Usage: OPM_THROW_NOLOG(ExceptionClass, "Error message " << value);
67 #define OPM_THROW_NOLOG(Exception, message) \
68  do { \
69  std::ostringstream oss__; \
70  oss__ << "[" << __FILE__ << ":" << __LINE__ << "] " << message; \
71  throw Exception(oss__.str()); \
72  } while (false)
73 
74 // throw an exception if a condition is true
75 #define OPM_ERROR_IF(condition, message) do {if(condition){ OPM_THROW(std::logic_error, message);}} while(false)
76 
77 #endif // #if HAVE_OPM_PARSER
78 
79 #endif // OPM_ERRORMACROS_HPP