RESTinio
Loading...
Searching...
No Matches
suppress_exceptions.hpp
Go to the documentation of this file.
1/*
2 * RESTinio
3 */
4
5/*!
6 * @file
7 * @brief Utilities for suppressing exceptions from some code block.
8 *
9 * @since v.0.6.0
10 */
11
12#pragma once
13
14#include <restinio/impl/include_fmtlib.hpp>
15
16#include <restinio/null_logger.hpp>
17
18#include <exception>
19
20namespace restinio
21{
22
23namespace utils
24{
25
26//
27// Wrappers for logging with suppressing of exceptions.
28//
29
30template< typename Logger, typename Message_Builder >
31void
32log_trace_noexcept( Logger && logger, Message_Builder && builder ) noexcept
33{
34 try { logger.trace( std::forward<Message_Builder>(builder) ); }
35 catch( ... ) {}
36}
37
38template< typename Message_Builder >
39void
40log_trace_noexcept( null_logger_t &, Message_Builder && ) noexcept
41{}
42
43template< typename Logger, typename Message_Builder >
44void
45log_info_noexcept( Logger && logger, Message_Builder && builder ) noexcept
46{
47 try { logger.info( std::forward<Message_Builder>(builder) ); }
48 catch( ... ) {}
49}
50
51template< typename Message_Builder >
52void
53log_info_noexcept( null_logger_t &, Message_Builder && ) noexcept
54{}
55
56template< typename Logger, typename Message_Builder >
57void
58log_warn_noexcept( Logger && logger, Message_Builder && builder ) noexcept
59{
60 try { logger.warn( std::forward<Message_Builder>(builder) ); }
61 catch( ... ) {}
62}
63
64template< typename Message_Builder >
65void
66log_warn_noexcept( null_logger_t &, Message_Builder && ) noexcept
67{}
68
69template< typename Logger, typename Message_Builder >
70void
71log_error_noexcept( Logger && logger, Message_Builder && builder ) noexcept
72{
73 try { logger.error( std::forward<Message_Builder>(builder) ); }
74 catch( ... ) {}
75}
76
77template< typename Message_Builder >
78void
79log_error_noexcept( null_logger_t &, Message_Builder && ) noexcept
80{}
81
82/*!
83 * @brief Helper function for execution a block of code with
84 * suppression of any exceptions raised inside that block.
85 *
86 * Exceptions caught are logged via \a logger. Exceptions thrown during
87 * this logging are suppressed.
88 *
89 * @since v.0.6.0
90 */
91template<
92 typename Logger,
93 typename Lambda >
95 //! Logger to be used.
96 Logger && logger,
97 //! Description of the block of code.
98 //! Will be used for logging about exceptions caught.
99 const char * block_description,
100 //! Block of code for execution.
101 Lambda && lambda ) noexcept
102{
103 try
104 {
105 lambda();
106 }
107 catch( const std::exception & x )
108 {
109 log_error_noexcept( logger, [&] {
110 return fmt::format(
111 RESTINIO_FMT_FORMAT_STRING( "an exception in '{}': {}" ),
112 block_description, x.what() );
113 } );
114 }
115 catch( ... )
116 {
117 log_error_noexcept( logger, [&] {
118 return fmt::format(
119 RESTINIO_FMT_FORMAT_STRING( "an unknown exception in '{}'" ),
120 block_description );
121 } );
122 }
123}
124
125/*!
126 * @brief Helper function for execution a block of code with
127 * suppression of any exceptions raised inside that block.
128 *
129 * All exceptions are simply intercepted. Nothing is logged in the
130 * case of an exception thrown.
131 *
132 * @since v.0.6.0
133 */
134template< typename Lambda >
135void suppress_exceptions_quietly( Lambda && lambda ) noexcept
136{
137 try
138 {
139 lambda();
140 }
141 catch( ... ) {}
142}
143
144
145} /* namespace utils */
146
147} /* namespace restinio */
No operation logger.
#define RESTINIO_FMT_FORMAT_STRING(s)
void suppress_exceptions(Logger &&logger, const char *block_description, Lambda &&lambda) noexcept
Helper function for execution a block of code with suppression of any exceptions raised inside that b...
void log_info_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_info_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void log_error_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void log_trace_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_warn_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void suppress_exceptions_quietly(Lambda &&lambda) noexcept
Helper function for execution a block of code with suppression of any exceptions raised inside that b...
void log_trace_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void log_warn_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_error_noexcept(null_logger_t &, Message_Builder &&) noexcept