]>
git.ipfire.org Git - thirdparty/squid.git/blob - src/base/TextException.h
15b39e6f61ce0b5b85ca4abdc2f44542456796f5
2 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 #ifndef SQUID_SRC_BASE_TEXTEXCEPTION_H
10 #define SQUID_SRC_BASE_TEXTEXCEPTION_H
12 #include "base/Assure.h"
13 #include "base/Here.h"
19 /// an std::runtime_error with thrower location info
20 class TextException
: public std::runtime_error
24 TextException(const char *message
, const SourceLocation
&location
):
25 std::runtime_error(message
),
29 TextException(SBuf message
, const SourceLocation
&location
);
31 TextException(const TextException
&) = default;
32 TextException(TextException
&&) = default;
33 TextException
& operator=(const TextException
&) = default;
35 /* std::runtime_error API */
36 ~TextException() throw() override
;
37 const char *what() const throw() override
;
39 /// same-location exceptions have the same ID
40 SourceLocationId
id() const { return where
.id(); }
42 /// dumps the exception text into the stream
43 std::ostream
&print(std::ostream
&) const;
45 /// code location related to the exception; usually the thrower location
48 // TODO: Add support for arbitrary (re)thrower-supplied details:
49 // std::tuple<Details...> details;
52 /// prints active (i.e., thrown but not yet handled) exception
53 std::ostream
&CurrentException(std::ostream
&);
55 /// If there is an active (i.e., thrown but not yet handled) exception, reports
56 /// it on a dedicated DebugExtra line. Otherwise, does nothing.
57 std::ostream
&CurrentExceptionExtra(std::ostream
&);
59 /// efficiently prints TextException
60 std::ostream
&operator <<(std::ostream
&, const TextException
&);
62 /// legacy convenience macro; it is not difficult to type Here() now
63 #define TexcHere(msg) TextException((msg), Here())
65 /// Like Must() but supports custom exception message and location.
66 /// \param description string literal describing the condition; what MUST happen
67 /// Deprecated: Use Assure2() for code logic checks and throw explicitly when
68 /// input validation fails.
69 #define Must3(condition, description, location) \
70 Assure_(3, (condition), ("check failed: " description), (location))
72 /// Like Assure() but only logs the exception if level-3 debugging is enabled
73 /// and runs even when NDEBUG macro is defined. Deprecated: Use Assure() for
74 /// code logic checks and throw explicitly when input validation fails.
75 #define Must(condition) Must3((condition), #condition, Here())
77 /// Reports and swallows all exceptions to prevent compiler warnings and runtime
78 /// errors related to throwing class destructors. Should be used for most dtors.
79 #define SWALLOW_EXCEPTIONS(code) \
83 debugs(0, DBG_IMPORTANT, "ERROR: Squid BUG: ignoring exception;" << \
84 Debug::Extra << "bug location: " << Here() << \
85 Debug::Extra << "ignored exception: " << CurrentException); \
88 #endif /* SQUID_SRC_BASE_TEXTEXCEPTION_H */