1 // 2 // Copyright 2017 The Abseil Authors. 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // https://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #ifndef ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ 18 #define ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ 19 20 #include <string> 21 22 #include "absl/base/config.h" 23 24 namespace absl { 25 ABSL_NAMESPACE_BEGIN 26 namespace base_internal { 27 28 // Helper functions that allow throwing exceptions consistently from anywhere. 29 // The main use case is for header-based libraries (eg templates), as they will 30 // be built by many different targets with their own compiler options. 31 // In particular, this will allow a safe way to throw exceptions even if the 32 // caller is compiled with -fno-exceptions. This is intended for implementing 33 // things like map<>::at(), which the standard documents as throwing an 34 // exception on error. 35 // 36 // Using other techniques like #if tricks could lead to ODR violations. 37 // 38 // You shouldn't use it unless you're writing code that you know will be built 39 // both with and without exceptions and you need to conform to an interface 40 // that uses exceptions. 41 42 [[noreturn]] void ThrowStdLogicError(const std::string& what_arg); 43 [[noreturn]] void ThrowStdLogicError(const char* what_arg); 44 [[noreturn]] void ThrowStdInvalidArgument(const std::string& what_arg); 45 [[noreturn]] void ThrowStdInvalidArgument(const char* what_arg); 46 [[noreturn]] void ThrowStdDomainError(const std::string& what_arg); 47 [[noreturn]] void ThrowStdDomainError(const char* what_arg); 48 [[noreturn]] void ThrowStdLengthError(const std::string& what_arg); 49 [[noreturn]] void ThrowStdLengthError(const char* what_arg); 50 [[noreturn]] void ThrowStdOutOfRange(const std::string& what_arg); 51 [[noreturn]] void ThrowStdOutOfRange(const char* what_arg); 52 [[noreturn]] void ThrowStdRuntimeError(const std::string& what_arg); 53 [[noreturn]] void ThrowStdRuntimeError(const char* what_arg); 54 [[noreturn]] void ThrowStdRangeError(const std::string& what_arg); 55 [[noreturn]] void ThrowStdRangeError(const char* what_arg); 56 [[noreturn]] void ThrowStdOverflowError(const std::string& what_arg); 57 [[noreturn]] void ThrowStdOverflowError(const char* what_arg); 58 [[noreturn]] void ThrowStdUnderflowError(const std::string& what_arg); 59 [[noreturn]] void ThrowStdUnderflowError(const char* what_arg); 60 61 [[noreturn]] void ThrowStdBadFunctionCall(); 62 [[noreturn]] void ThrowStdBadAlloc(); 63 64 // ThrowStdBadArrayNewLength() cannot be consistently supported because 65 // std::bad_array_new_length is missing in libstdc++ until 4.9.0. 66 // https://gcc.gnu.org/onlinedocs/gcc-4.8.3/libstdc++/api/a01379_source.html 67 // https://gcc.gnu.org/onlinedocs/gcc-4.9.0/libstdc++/api/a01327_source.html 68 // libcxx (as of 3.2) and msvc (as of 2015) both have it. 69 // [[noreturn]] void ThrowStdBadArrayNewLength(); 70 71 } // namespace base_internal 72 ABSL_NAMESPACE_END 73 } // namespace absl 74 75 #endif // ABSL_BASE_INTERNAL_THROW_DELEGATE_H_ 76