1 // Copyright Contributors to the OpenVDB Project 2 // SPDX-License-Identifier: MPL-2.0 3 4 #ifndef OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED 5 #define OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED 6 7 #include <openvdb/version.h> 8 #include <exception> 9 #include <sstream> 10 #include <string> 11 12 13 namespace openvdb { 14 OPENVDB_USE_VERSION_NAMESPACE 15 namespace OPENVDB_VERSION_NAME { 16 17 class OPENVDB_API Exception: public std::exception 18 { 19 public: 20 Exception(const Exception&) = default; 21 Exception(Exception&&) = default; 22 Exception& operator=(const Exception&) = default; 23 Exception& operator=(Exception&&) = default; 24 ~Exception() override = default; 25 what()26 const char* what() const noexcept override 27 { 28 try { return mMessage.c_str(); } catch (...) {} 29 return nullptr; 30 } 31 32 protected: Exception()33 Exception() noexcept {} 34 explicit Exception(const char* eType, const std::string* const msg = nullptr) noexcept 35 { 36 try { 37 if (eType) mMessage = eType; 38 if (msg) mMessage += ": " + (*msg); catch(...)39 } catch (...) {} 40 } 41 42 private: 43 std::string mMessage; 44 }; 45 46 47 #define OPENVDB_EXCEPTION(_classname) \ 48 class OPENVDB_API _classname: public Exception \ 49 { \ 50 public: \ 51 _classname() noexcept: Exception( #_classname ) {} \ 52 explicit _classname(const std::string& msg) noexcept: Exception( #_classname , &msg) {} \ 53 } 54 55 56 OPENVDB_EXCEPTION(ArithmeticError); 57 OPENVDB_EXCEPTION(IndexError); 58 OPENVDB_EXCEPTION(IoError); 59 OPENVDB_EXCEPTION(KeyError); 60 OPENVDB_EXCEPTION(LookupError); 61 OPENVDB_EXCEPTION(NotImplementedError); 62 OPENVDB_EXCEPTION(ReferenceError); 63 OPENVDB_EXCEPTION(RuntimeError); 64 OPENVDB_EXCEPTION(TypeError); 65 OPENVDB_EXCEPTION(ValueError); 66 67 #undef OPENVDB_EXCEPTION 68 69 70 } // namespace OPENVDB_VERSION_NAME 71 } // namespace openvdb 72 73 74 #define OPENVDB_THROW(exception, message) \ 75 { \ 76 std::string _openvdb_throw_msg; \ 77 try { \ 78 std::ostringstream _openvdb_throw_os; \ 79 _openvdb_throw_os << message; \ 80 _openvdb_throw_msg = _openvdb_throw_os.str(); \ 81 } catch (...) {} \ 82 throw exception(_openvdb_throw_msg); \ 83 } // OPENVDB_THROW 84 85 #endif // OPENVDB_EXCEPTIONS_HAS_BEEN_INCLUDED 86