Blame


1 bcf3fb81 2023-08-16 continue /** Errors handling */
2 bcf3fb81 2023-08-16 continue
3 bcf3fb81 2023-08-16 continue #include <errno.h>
4 bcf3fb81 2023-08-16 continue #include <string.h>
5 bcf3fb81 2023-08-16 continue #include <ostream>
6 bcf3fb81 2023-08-16 continue
7 bcf3fb81 2023-08-16 continue #pragma once
8 bcf3fb81 2023-08-16 continue
9 bcf3fb81 2023-08-16 continue
10 bcf3fb81 2023-08-16 continue namespace vostok
11 bcf3fb81 2023-08-16 continue {
12 bcf3fb81 2023-08-16 continue namespace error
13 bcf3fb81 2023-08-16 continue {
14 bcf3fb81 2023-08-16 continue
15 bcf3fb81 2023-08-16 continue
16 bcf3fb81 2023-08-16 continue /** Current output log stream (`std::err` on starup) */
17 bcf3fb81 2023-08-16 continue extern std::ostream &g_log;
18 bcf3fb81 2023-08-16 continue
19 bcf3fb81 2023-08-16 continue
20 bcf3fb81 2023-08-16 continue /** Default error code (errno) printer */
21 d6e3180e 2023-08-30 continue class Print
22 bcf3fb81 2023-08-16 continue {
23 d6e3180e 2023-08-30 continue public:
24 d6e3180e 2023-08-30 continue explicit Print(int error=errno) : m_error{error} {}
25 bcf3fb81 2023-08-16 continue void operator() () const
26 bcf3fb81 2023-08-16 continue {
27 2f4289de 2023-08-30 continue g_log << "Error code (" << std::dec << m_error << "): " << strerror(m_error);
28 bcf3fb81 2023-08-16 continue }
29 d6e3180e 2023-08-30 continue
30 d6e3180e 2023-08-30 continue private:
31 d6e3180e 2023-08-30 continue const int m_error;
32 bcf3fb81 2023-08-16 continue };
33 bcf3fb81 2023-08-16 continue
34 bcf3fb81 2023-08-16 continue
35 bcf3fb81 2023-08-16 continue /** Empty error code printer */
36 d6e3180e 2023-08-30 continue class None
37 bcf3fb81 2023-08-16 continue {
38 d6e3180e 2023-08-30 continue public:
39 bcf3fb81 2023-08-16 continue void operator() () const {}
40 bcf3fb81 2023-08-16 continue };
41 bcf3fb81 2023-08-16 continue
42 bcf3fb81 2023-08-16 continue
43 bcf3fb81 2023-08-16 continue /** Error handler: print action, print error */
44 bcf3fb81 2023-08-16 continue template<
45 d6e3180e 2023-08-30 continue typename PrintAction,
46 d6e3180e 2023-08-30 continue typename PrintError
47 bcf3fb81 2023-08-16 continue >
48 bcf3fb81 2023-08-16 continue void
49 bcf3fb81 2023-08-16 continue occurred(
50 d6e3180e 2023-08-30 continue PrintAction print_action,
51 d6e3180e 2023-08-30 continue PrintError print_error
52 bcf3fb81 2023-08-16 continue )
53 bcf3fb81 2023-08-16 continue {
54 bcf3fb81 2023-08-16 continue print_action();
55 2f4289de 2023-08-30 continue g_log << " failed. ";
56 bcf3fb81 2023-08-16 continue print_error();
57 2f4289de 2023-08-30 continue g_log << std::endl;
58 bcf3fb81 2023-08-16 continue }
59 bcf3fb81 2023-08-16 continue
60 bcf3fb81 2023-08-16 continue template<typename TPrintError>
61 bcf3fb81 2023-08-16 continue void
62 bcf3fb81 2023-08-16 continue occurred(
63 bcf3fb81 2023-08-16 continue const char *action,
64 bcf3fb81 2023-08-16 continue TPrintError print_error
65 bcf3fb81 2023-08-16 continue )
66 bcf3fb81 2023-08-16 continue {
67 bcf3fb81 2023-08-16 continue occurred(
68 bcf3fb81 2023-08-16 continue [action]
69 bcf3fb81 2023-08-16 continue {
70 bcf3fb81 2023-08-16 continue g_log << action;
71 bcf3fb81 2023-08-16 continue },
72 bcf3fb81 2023-08-16 continue print_error
73 bcf3fb81 2023-08-16 continue );
74 bcf3fb81 2023-08-16 continue }
75 bcf3fb81 2023-08-16 continue
76 bcf3fb81 2023-08-16 continue
77 bcf3fb81 2023-08-16 continue } // namespace error
78 bcf3fb81 2023-08-16 continue } // namespace vostok