1 /* 2 * Copyright Andrey Semashev 2007 - 2015. 3 * Distributed under the Boost Software License, Version 1.0. 4 * (See accompanying file LICENSE_1_0.txt or copy at 5 * http://www.boost.org/LICENSE_1_0.txt) 6 */ 7 /*! 8 * \file 9 * \author Andrey Semashev 10 * \date 31.10.2009 11 * 12 * The header contains exception classes declarations. 13 */ 14 15 #ifndef BOOST_LOG_EXCEPTIONS_HPP_INCLUDED_ 16 #define BOOST_LOG_EXCEPTIONS_HPP_INCLUDED_ 17 18 #include <cstddef> 19 #include <string> 20 #include <stdexcept> 21 #include <boost/type_index.hpp> 22 #include <boost/preprocessor/seq/enum.hpp> 23 #include <boost/system/error_code.hpp> 24 #include <boost/system/system_error.hpp> 25 #include <boost/log/detail/config.hpp> 26 #include <boost/log/attributes/attribute_name.hpp> 27 #include <boost/log/detail/header.hpp> 28 29 #ifdef BOOST_HAS_PRAGMA_ONCE 30 #pragma once 31 #endif 32 33 namespace boost { 34 35 // Forward-declaration of an exception base class from Boost.Exception 36 #if defined(__GNUC__) 37 # if (__GNUC__ == 4 && __GNUC_MINOR__ >= 1) || (__GNUC__ > 4) 38 # pragma GCC visibility push (default) 39 40 class exception; 41 42 # pragma GCC visibility pop 43 # else 44 45 class exception; 46 47 # endif 48 #else 49 50 class BOOST_SYMBOL_VISIBLE exception; 51 52 #endif 53 54 BOOST_LOG_OPEN_NAMESPACE 55 56 namespace aux { 57 58 //! Attaches attribute name exception information 59 BOOST_LOG_API void attach_attribute_name_info(exception& e, attribute_name const& name); 60 61 } // namespace aux 62 63 /*! 64 * \brief Base class for memory allocation errors 65 * 66 * Exceptions derived from this class indicate problems with memory allocation. 67 */ 68 class BOOST_LOG_API bad_alloc : 69 public std::bad_alloc 70 { 71 private: 72 std::string m_message; 73 74 public: 75 /*! 76 * Initializing constructor. Creates an exception with the specified error message. 77 */ 78 explicit bad_alloc(const char* descr); 79 /*! 80 * Initializing constructor. Creates an exception with the specified error message. 81 */ 82 explicit bad_alloc(std::string const& descr); 83 /*! 84 * Destructor 85 */ 86 ~bad_alloc() throw() BOOST_OVERRIDE; 87 88 /*! 89 * Error message accessor. 90 */ 91 const char* what() const throw() BOOST_OVERRIDE; 92 93 #ifndef BOOST_LOG_DOXYGEN_PASS 94 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 95 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 96 #endif 97 }; 98 99 /*! 100 * \brief The exception is used to indicate reaching a storage capacity limit 101 */ 102 class BOOST_LOG_API capacity_limit_reached : 103 public bad_alloc 104 { 105 public: 106 /*! 107 * Initializing constructor. Creates an exception with the specified error message. 108 */ 109 explicit capacity_limit_reached(const char* descr); 110 /*! 111 * Initializing constructor. Creates an exception with the specified error message. 112 */ 113 explicit capacity_limit_reached(std::string const& descr); 114 /*! 115 * Destructor 116 */ 117 ~capacity_limit_reached() throw() BOOST_OVERRIDE; 118 119 #ifndef BOOST_LOG_DOXYGEN_PASS 120 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 121 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 122 #endif 123 }; 124 125 /*! 126 * \brief Base class for runtime exceptions from the logging library 127 * 128 * Exceptions derived from this class indicate a problem that may not directly 129 * be caused by the user's code that interacts with the library, such as 130 * errors caused by input data. 131 */ 132 class BOOST_LOG_API runtime_error : 133 public std::runtime_error 134 { 135 public: 136 /*! 137 * Initializing constructor. Creates an exception with the specified error message. 138 */ 139 explicit runtime_error(std::string const& descr); 140 /*! 141 * Destructor 142 */ 143 ~runtime_error() throw() BOOST_OVERRIDE; 144 }; 145 146 /*! 147 * \brief Exception class that is used to indicate errors of missing values 148 */ 149 class BOOST_LOG_API missing_value : 150 public runtime_error 151 { 152 public: 153 /*! 154 * Default constructor. Creates an exception with the default error message. 155 */ 156 missing_value(); 157 /*! 158 * Initializing constructor. Creates an exception with the specified error message. 159 */ 160 explicit missing_value(std::string const& descr); 161 /*! 162 * Destructor 163 */ 164 ~missing_value() throw() BOOST_OVERRIDE; 165 166 #ifndef BOOST_LOG_DOXYGEN_PASS 167 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 168 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 169 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 170 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, attribute_name const& name); 171 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, attribute_name const& name); 172 #endif 173 }; 174 175 /*! 176 * \brief Exception class that is used to indicate errors of incorrect type of an object 177 */ 178 class BOOST_LOG_API invalid_type : 179 public runtime_error 180 { 181 public: 182 /*! 183 * Default constructor. Creates an exception with the default error message. 184 */ 185 invalid_type(); 186 /*! 187 * Initializing constructor. Creates an exception with the specified error message. 188 */ 189 explicit invalid_type(std::string const& descr); 190 /*! 191 * Destructor 192 */ 193 ~invalid_type() throw() BOOST_OVERRIDE; 194 195 #ifndef BOOST_LOG_DOXYGEN_PASS 196 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 197 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 198 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 199 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, attribute_name const& name); 200 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, attribute_name const& name); 201 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, typeindex::type_index const& type); 202 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, typeindex::type_index const& type); 203 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, attribute_name const& name, typeindex::type_index const& type); 204 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, attribute_name const& name, typeindex::type_index const& type); 205 #endif 206 }; 207 208 /*! 209 * \brief Exception class that is used to indicate errors of incorrect value of an object 210 */ 211 class BOOST_LOG_API invalid_value : 212 public runtime_error 213 { 214 public: 215 /*! 216 * Default constructor. Creates an exception with the default error message. 217 */ 218 invalid_value(); 219 /*! 220 * Initializing constructor. Creates an exception with the specified error message. 221 */ 222 explicit invalid_value(std::string const& descr); 223 /*! 224 * Destructor 225 */ 226 ~invalid_value() throw() BOOST_OVERRIDE; 227 228 #ifndef BOOST_LOG_DOXYGEN_PASS 229 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 230 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 231 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 232 #endif 233 }; 234 235 /*! 236 * \brief Exception class that is used to indicate parsing errors 237 */ 238 class BOOST_LOG_API parse_error : 239 public runtime_error 240 { 241 public: 242 /*! 243 * Default constructor. Creates an exception with the default error message. 244 */ 245 parse_error(); 246 /*! 247 * Initializing constructor. Creates an exception with the specified error message. 248 */ 249 explicit parse_error(std::string const& descr); 250 /*! 251 * Destructor 252 */ 253 ~parse_error() throw() BOOST_OVERRIDE; 254 255 #ifndef BOOST_LOG_DOXYGEN_PASS 256 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 257 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 258 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 259 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, std::size_t content_line); 260 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, std::size_t content_line); 261 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, attribute_name const& name); 262 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, attribute_name const& name); 263 #endif 264 }; 265 266 /*! 267 * \brief Exception class that is used to indicate conversion errors 268 */ 269 class BOOST_LOG_API conversion_error : 270 public runtime_error 271 { 272 public: 273 /*! 274 * Default constructor. Creates an exception with the default error message. 275 */ 276 conversion_error(); 277 /*! 278 * Initializing constructor. Creates an exception with the specified error message. 279 */ 280 explicit conversion_error(std::string const& descr); 281 /*! 282 * Destructor 283 */ 284 ~conversion_error() throw() BOOST_OVERRIDE; 285 286 #ifndef BOOST_LOG_DOXYGEN_PASS 287 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 288 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 289 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 290 #endif 291 }; 292 293 /*! 294 * \brief Exception class that is used to indicate underlying OS API errors 295 */ 296 class BOOST_LOG_API system_error : 297 public boost::system::system_error 298 { 299 public: 300 /*! 301 * Initializing constructor. Creates an exception with the specified error message. 302 */ 303 system_error(boost::system::error_code code, std::string const& descr); 304 /*! 305 * Destructor 306 */ 307 ~system_error() throw() BOOST_OVERRIDE; 308 309 #ifndef BOOST_LOG_DOXYGEN_PASS 310 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, int system_error_code); 311 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, int system_error_code); 312 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr, boost::system::error_code code); 313 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr, boost::system::error_code code); 314 #endif 315 }; 316 317 /*! 318 * \brief Base class for logic exceptions from the logging library 319 * 320 * Exceptions derived from this class usually indicate errors on the user's side, such as 321 * incorrect library usage. 322 */ 323 class BOOST_LOG_API logic_error : 324 public std::logic_error 325 { 326 public: 327 /*! 328 * Initializing constructor. Creates an exception with the specified error message. 329 */ 330 explicit logic_error(std::string const& descr); 331 /*! 332 * Destructor 333 */ 334 ~logic_error() throw() BOOST_OVERRIDE; 335 336 #ifndef BOOST_LOG_DOXYGEN_PASS 337 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 338 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 339 #endif 340 }; 341 342 /*! 343 * \brief Exception class that is used to indicate ODR violation 344 */ 345 class BOOST_LOG_API odr_violation : 346 public logic_error 347 { 348 public: 349 /*! 350 * Default constructor. Creates an exception with the default error message. 351 */ 352 odr_violation(); 353 /*! 354 * Initializing constructor. Creates an exception with the specified error message. 355 */ 356 explicit odr_violation(std::string const& descr); 357 /*! 358 * Destructor 359 */ 360 ~odr_violation() throw() BOOST_OVERRIDE; 361 362 #ifndef BOOST_LOG_DOXYGEN_PASS 363 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 364 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 365 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 366 #endif 367 }; 368 369 /*! 370 * \brief Exception class that is used to indicate invalid call sequence 371 */ 372 class BOOST_LOG_API unexpected_call : 373 public logic_error 374 { 375 public: 376 /*! 377 * Default constructor. Creates an exception with the default error message. 378 */ 379 unexpected_call(); 380 /*! 381 * Initializing constructor. Creates an exception with the specified error message. 382 */ 383 explicit unexpected_call(std::string const& descr); 384 /*! 385 * Destructor 386 */ 387 ~unexpected_call() throw() BOOST_OVERRIDE; 388 389 #ifndef BOOST_LOG_DOXYGEN_PASS 390 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 391 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 392 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 393 #endif 394 }; 395 396 /*! 397 * \brief Exception class that is used to indicate invalid library setup 398 */ 399 class BOOST_LOG_API setup_error : 400 public logic_error 401 { 402 public: 403 /*! 404 * Default constructor. Creates an exception with the default error message. 405 */ 406 setup_error(); 407 /*! 408 * Initializing constructor. Creates an exception with the specified error message. 409 */ 410 explicit setup_error(std::string const& descr); 411 /*! 412 * Destructor 413 */ 414 ~setup_error() throw() BOOST_OVERRIDE; 415 416 #ifndef BOOST_LOG_DOXYGEN_PASS 417 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 418 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 419 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 420 #endif 421 }; 422 423 /*! 424 * \brief Exception class that is used to indicate library limitation 425 */ 426 class BOOST_LOG_API limitation_error : 427 public logic_error 428 { 429 public: 430 /*! 431 * Default constructor. Creates an exception with the default error message. 432 */ 433 limitation_error(); 434 /*! 435 * Initializing constructor. Creates an exception with the specified error message. 436 */ 437 explicit limitation_error(std::string const& descr); 438 /*! 439 * Destructor 440 */ 441 ~limitation_error() throw() BOOST_OVERRIDE; 442 443 #ifndef BOOST_LOG_DOXYGEN_PASS 444 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line); 445 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, const char* descr); 446 static BOOST_LOG_NORETURN void throw_(const char* file, std::size_t line, std::string const& descr); 447 #endif 448 }; 449 450 BOOST_LOG_CLOSE_NAMESPACE // namespace log 451 452 } // namespace boost 453 454 #ifndef BOOST_LOG_DOXYGEN_PASS 455 456 #define BOOST_LOG_THROW(ex)\ 457 ex::throw_(__FILE__, static_cast< std::size_t >(__LINE__)) 458 459 #define BOOST_LOG_THROW_DESCR(ex, descr)\ 460 ex::throw_(__FILE__, static_cast< std::size_t >(__LINE__), descr) 461 462 #define BOOST_LOG_THROW_DESCR_PARAMS(ex, descr, params)\ 463 ex::throw_(__FILE__, static_cast< std::size_t >(__LINE__), descr, BOOST_PP_SEQ_ENUM(params)) 464 465 #endif // BOOST_LOG_DOXYGEN_PASS 466 467 #include <boost/log/detail/footer.hpp> 468 469 #endif // BOOST_LOG_EXCEPTIONS_HPP_INCLUDED_ 470