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( "an exception in '{}': {}",
111  block_description, x.what() );
112  } );
113  }
114  catch( ... )
115  {
116  log_error_noexcept( logger, [&] {
117  return fmt::format( "an unknown exception in '{}'",
119  } );
120  }
121 }
122 
123 /*!
124  * @brief Helper function for execution a block of code with
125  * suppression of any exceptions raised inside that block.
126  *
127  * All exceptions are simply intercepted. Nothing is logged in the
128  * case of an exception thrown.
129  *
130  * @since v.0.6.0
131  */
132 template< typename Lambda >
133 void suppress_exceptions_quietly( Lambda && lambda ) noexcept
134 {
135  try
136  {
137  lambda();
138  }
139  catch( ... ) {}
140 }
141 
142 
143 } /* namespace utils */
144 
145 } /* namespace restinio */
void log_info_noexcept(Logger &&logger, Message_Builder &&builder) noexcept
void normalize_to(string_view_t what, char *dest)
Perform normalization of URI value.
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
std::enable_if< std::is_same< Parameter_Container, query_string_params_t >::value||std::is_same< Parameter_Container, router::route_params_t >::value, optional_t< Value_Type > >::type opt_value(const Parameter_Container &params, string_view_t key)
Gets the value of a parameter specified by key wrapped in optional_t<Value_Type> if parameter exists ...
Definition: value_or.hpp:64