RESTinio
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 
20 namespace restinio
21 {
22 
23 namespace utils
24 {
25 
26 //
27 // Wrappers for logging with suppressing of exceptions.
28 //
29 
30 template< typename Logger, typename Message_Builder >
31 void
32 log_trace_noexcept( Logger && logger, Message_Builder && builder ) noexcept
33 {
35  catch( ... ) {}
36 }
37 
38 template< typename Message_Builder >
39 void
40 log_trace_noexcept( null_logger_t &, Message_Builder && ) noexcept
41 {}
42 
43 template< typename Logger, typename Message_Builder >
44 void
45 log_info_noexcept( Logger && logger, Message_Builder && builder ) noexcept
46 {
48  catch( ... ) {}
49 }
50 
51 template< typename Message_Builder >
52 void
53 log_info_noexcept( null_logger_t &, Message_Builder && ) noexcept
54 {}
55 
56 template< typename Logger, typename Message_Builder >
57 void
58 log_warn_noexcept( Logger && logger, Message_Builder && builder ) noexcept
59 {
61  catch( ... ) {}
62 }
63 
64 template< typename Message_Builder >
65 void
66 log_warn_noexcept( null_logger_t &, Message_Builder && ) noexcept
67 {}
68 
69 template< typename Logger, typename Message_Builder >
70 void
71 log_error_noexcept( Logger && logger, Message_Builder && builder ) noexcept
72 {
74  catch( ... ) {}
75 }
76 
77 template< typename Message_Builder >
78 void
79 log_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  */
91 template<
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 '{}'" ),
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  */
134 template< typename Lambda >
135 void 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 */
string_view_t from_string< string_view_t >(string_view_t s)
Get a value from string_view.
void log_info_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, std::optional< Value_Type > >::type opt_value(const Parameter_Container &params, string_view_t key)
Gets the value of a parameter specified by key wrapped in std::optional<Value_Type> if parameter exis...
Definition: value_or.hpp:64
void log_error_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_trace_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 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_warn_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_info_noexcept(null_logger_t &, Message_Builder &&) noexcept
void log_error_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void log_warn_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void log_trace_noexcept(null_logger_t &, Message_Builder &&) noexcept