]> git.ipfire.org Git - thirdparty/squid.git/blame - src/base/TextException.h
Source Format Enforcement (#1234)
[thirdparty/squid.git] / src / base / TextException.h
CommitLineData
bbc27441 1/*
b8ae064d 2 * Copyright (C) 1996-2023 The Squid Software Foundation and contributors
bbc27441
AJ
3 *
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.
7 */
8
774c051c 9#ifndef SQUID__TEXTEXCEPTION_H
10#define SQUID__TEXTEXCEPTION_H
11
b9a1bbfb 12#include "base/Assure.h"
ebaabe74 13#include "base/Here.h"
774c051c 14
205f2345 15#include <stdexcept>
774c051c 16
e99fa721
EB
17class SBuf;
18
ebaabe74
AR
19/// an std::runtime_error with thrower location info
20class TextException: public std::runtime_error
774c051c 21{
22
23public:
ebaabe74
AR
24 TextException(const char *message, const SourceLocation &location):
25 std::runtime_error(message),
26 where(location)
27 {}
774c051c 28
ebaabe74 29 TextException(SBuf message, const SourceLocation &location);
b3c9f64a 30
ebaabe74
AR
31 TextException(const TextException &) = default;
32 TextException(TextException &&) = default;
33 TextException& operator=(const TextException &) = default;
774c051c 34
ebaabe74 35 /* std::runtime_error API */
337b9aa4
AR
36 ~TextException() throw() override;
37 const char *what() const throw() override;
77442705 38
ebaabe74
AR
39 /// same-location exceptions have the same ID
40 SourceLocationId id() const { return where.id(); }
774c051c 41
ebaabe74
AR
42 /// dumps the exception text into the stream
43 std::ostream &print(std::ostream &) const;
64b66b76 44
ebaabe74
AR
45 /// code location related to the exception; usually the thrower location
46 SourceLocation where;
b3c9f64a 47
ebaabe74
AR
48 // TODO: Add support for arbitrary (re)thrower-supplied details:
49 // std::tuple<Details...> details;
774c051c 50};
51
ebaabe74
AR
52/// prints active (i.e., thrown but not yet handled) exception
53std::ostream &CurrentException(std::ostream &);
54
83b053a0
CT
55/// efficiently prints TextException
56std::ostream &operator <<(std::ostream &, const TextException &);
57
ebaabe74
AR
58/// legacy convenience macro; it is not difficult to type Here() now
59#define TexcHere(msg) TextException((msg), Here())
60
b9a1bbfb 61/// Like Must() but supports custom exception message and location.
2bde9c7c 62/// \param description string literal describing the condition; what MUST happen
b9a1bbfb
AR
63/// Deprecated: Use Assure2() for code logic checks and throw explicitly when
64/// input validation fails.
2bde9c7c 65#define Must3(condition, description, location) \
b9a1bbfb
AR
66 Assure_(3, (condition), ("check failed: " description), (location))
67
68/// Like Assure() but only logs the exception if level-3 debugging is enabled
69/// and runs even when NDEBUG macro is defined. Deprecated: Use Assure() for
70/// code logic checks and throw explicitly when input validation fails.
2bde9c7c 71#define Must(condition) Must3((condition), #condition, Here())
ebaabe74
AR
72
73/// Reports and swallows all exceptions to prevent compiler warnings and runtime
74/// errors related to throwing class destructors. Should be used for most dtors.
75#define SWALLOW_EXCEPTIONS(code) \
76 try { \
77 code \
78 } catch (...) { \
d816f28d 79 debugs(0, DBG_IMPORTANT, "ERROR: Squid BUG: ignoring exception;" << \
ccfbe8f4
AR
80 Debug::Extra << "bug location: " << Here() << \
81 Debug::Extra << "ignored exception: " << CurrentException); \
64b66b76 82 }
774c051c 83
84#endif /* SQUID__TEXTEXCEPTION_H */
f53969cc 85