libzypp: zypp/base/Exception.cc Source File

libzypp 17.25.10

Exception.cc
Go to the documentation of this file.
1 /*---------------------------------------------------------------------\
2 | ____ _ __ __ ___ |
3 | |__ / \ / / . \ . \ |
4 | / / \ V /| _/ _/ |
5 | / /__ | | | | | | |
6 | /_____||_| |_| |_| |
7 | |
8 \---------------------------------------------------------------------*/
12 #include <iostream>
13 #include <sstream>
14
15 #include <zypp/base/Logger.h>
16 #include <zypp/base/LogTools.h>
17 #include <zypp/base/Gettext.h>
18 #include <zypp/base/String.h>
19 #include <zypp/base/Exception.h>
20
21 using std::endl;
22
24 namespace zypp
25 {
27 namespace exception_detail
28 {
29
30 std::string CodeLocation::asString() const
31 {
32 return str::form( "%s(%s):%u",
33 _file.c_str(),
34 _func.c_str(),
35 _line );
36 }
37
38 std::ostream & operator<<( std::ostream & str, const CodeLocation & obj )
39 { return str << obj.asString(); }
40
42 } // namespace exception_detail
44
45 Exception::Exception()
46 {}
47
48 Exception::Exception( const std::string & msg_r )
49 : _msg( msg_r )
50 {}
51
52 Exception::Exception( std::string && msg_r )
53 : _msg( std::move(msg_r) )
54 {}
55
56 Exception::Exception( const std::string & msg_r, const Exception & history_r )
57 : _msg( msg_r )
58 { remember( history_r ); }
59
60 Exception::Exception( std::string && msg_r, const Exception & history_r )
61 : _msg( std::move(msg_r) )
62 { remember( history_r ); }
63
64 Exception::Exception( const std::string & msg_r, Exception && history_r )
65 : _msg( msg_r )
66 { remember( std::move(history_r) ); }
67
68 Exception::Exception( std::string && msg_r, Exception && history_r )
69 : _msg( std::move(msg_r) )
70 { remember( std::move(history_r) ); }
71
72 Exception::~Exception() throw()
73 {}
74
75 std::string Exception::asString() const
76 {
77 std::ostringstream str;
78 dumpOn( str );
79 return str.str();
80 }
81
82 std::string Exception::asUserString() const
83 {
84 std::ostringstream str;
85 dumpOn( str );
86 // call gettext to translate the message. This will
87 // not work if dumpOn() uses composed messages.
88 return _(str.str().c_str());
89 }
90
91 std::string Exception::asUserHistory() const
92 {
93 if ( historyEmpty() )
94 return asUserString();
95
96 std::string ret( asUserString() );
97 if ( ret.empty() )
98 return historyAsString();
99
100 ret += '\n';
101 ret += historyAsString();
102 return ret;
103 }
104
105 void Exception::remember( const Exception & old_r )
106 {
107 if ( &old_r != this ) // no self-remember
108 {
109 History newh( old_r._history.begin(), old_r._history.end() );
110 newh.push_front( old_r.asUserString() );
111 _history.swap( newh );
112 }
113 }
114
115 void Exception::remember( Exception && old_r )
116 {
117 if ( &old_r != this ) // no self-remember
118 {
119 History & newh( old_r._history ); // stealing it
120 newh.push_front( old_r.asUserString() );
121 _history.swap( newh );
122 }
123 }
124
125 void Exception::addHistory( const std::string & msg_r )
126 { _history.push_front( msg_r ); }
127
128 void Exception::addHistory( std::string && msg_r )
129 { _history.push_front( std::move(msg_r) ); }
130
131 std::string Exception::historyAsString() const
132 {
133 // TranslatorExplanation followed by the list of error messages that lead to this exception
134 std::string history( _("History:") );
135 std::ostringstream ret;
136 dumpRange( ret, historyBegin(), historyEnd(),
137 "", history+"\n - ", "\n - ", "\n", "" );
138 return ret.str();
139 }
140
141 std::ostream & Exception::dumpOn( std::ostream & str ) const
142 { return str << _msg; }
143
144 std::ostream & Exception::dumpError( std::ostream & str ) const
145 { return dumpOn( str << _where << ": " ); }
146
147 std::ostream & operator<<( std::ostream & str, const Exception & obj )
148 { return obj.dumpError( str ); }
149
150
151 std::string Exception::strErrno( int errno_r )
152 { return str::strerror( errno_r ); }
153
154 std::string Exception::strErrno( int errno_r, const std::string & msg_r )
155 { return strErrno( errno_r, std::string(msg_r) ); }
156
157 std::string Exception::strErrno( int errno_r, std::string && msg_r )
158 {
159 msg_r += ": ";
160 return msg_r += strErrno( errno_r );
161 }
162
163 void Exception::log( const Exception & excpt_r, const CodeLocation & where_r,
164 const char *const prefix_r )
165 {
166 INT << where_r << " " << prefix_r << " " << excpt_r.asUserHistory() << endl;
167 }
168
169 void Exception::log( const char * typename_r, const CodeLocation & where_r,
170 const char *const prefix_r )
171 {
172 INT << where_r << " " << prefix_r << " exception of type " << typename_r << endl;
173 }
175 } // namespace zypp
Exception.h
Gettext.h
Interface to gettext.
_
#define _(MSG)
Definition: Gettext.h:37
LogTools.h
Logger.h
INT
#define INT
Definition: Logger.h:95
String.h
zypp::Exception
Base class for Exception.
Definition: Exception.h:146
zypp::Exception::_msg
std::string _msg
Definition: Exception.h:296
zypp::Exception::strErrno
static std::string strErrno(int errno_r)
Make a string from errno_r.
Definition: Exception.cc:151
zypp::Exception::~Exception
virtual ~Exception()
Dtor.
Definition: Exception.cc:72
zypp::Exception::asUserHistory
std::string asUserHistory() const
A single (multiline) string composed of asUserString and historyAsString.
Definition: Exception.cc:91
zypp::Exception::dumpError
std::ostream & dumpError(std::ostream &str) const
Called by std::ostream & operator<<.
Definition: Exception.cc:144
zypp::Exception::asUserString
std::string asUserString() const
Translated error message as string suitable for the user.
Definition: Exception.cc:82
zypp::Exception::_where
CodeLocation _where
Definition: Exception.h:295
zypp::Exception::_history
History _history
Definition: Exception.h:297
zypp::Exception::addHistory
void addHistory(const std::string &msg_r)
Add some message text to the history.
Definition: Exception.cc:125
zypp::Exception::historyAsString
std::string historyAsString() const
The history as string.
Definition: Exception.cc:131
zypp::Exception::dumpOn
virtual std::ostream & dumpOn(std::ostream &str) const
Overload this to print a proper error message.
Definition: Exception.cc:141
zypp::Exception::asString
std::string asString() const
Error message provided by dumpOn as string.
Definition: Exception.cc:75
zypp::Exception::log
static void log(const Exception &excpt_r, const CodeLocation &where_r, const char *const prefix_r)
Drop a logline on throw, catch or rethrow.
Definition: Exception.cc:163
zypp::Exception::historyBegin
HistoryIterator historyBegin() const
Iterator pointing to the most recent message.
Definition: Exception.h:241
zypp::Exception::History
std::list< std::string > History
Definition: Exception.h:151
zypp::Exception::Exception
Exception()
Default ctor.
Definition: Exception.cc:45
zypp::Exception::operator<<
friend std::ostream & operator<<(std::ostream &str, const Exception &obj)
Definition: Exception.cc:147
zypp::Exception::historyEnd
HistoryIterator historyEnd() const
Iterator pointing behind the last message.
Definition: Exception.h:245
zypp::Exception::historyEmpty
bool historyEmpty() const
Whether the history list is empty.
Definition: Exception.h:249
zypp::Exception::remember
void remember(const Exception &old_r)
Store an other Exception as history.
Definition: Exception.cc:105
std
Definition: Arch.h:348
str
String related utilities and Regular expression matching.
zypp::exception_detail::operator<<
std::ostream & operator<<(std::ostream &str, const CodeLocation &obj)
Definition: Exception.cc:38
zypp::str::strerror
std::string strerror(int errno_r)
Return string describing the error_r code.
Definition: String.cc:53
zypp::str::form
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
Definition: String.cc:36
zypp
Easy-to use interface to the ZYPP dependency resolver.
Definition: CodePitfalls.doc:2
zypp::dumpRange
std::ostream & dumpRange(std::ostream &str, TIterator begin, TIterator end, const std::string &intro="{", const std::string &pfx="\n ", const std::string &sep="\n ", const std::string &sfx="\n", const std::string &extro="}")
Print range defined by iterators (multiline style).
Definition: LogTools.h:91
zypp::exception_detail::CodeLocation
Keep FILE, FUNCTION and LINE.
Definition: Exception.h:35
zypp::exception_detail::CodeLocation::_file
std::string _file
Definition: Exception.h:54
zypp::exception_detail::CodeLocation::asString
std::string asString() const
Location as string.
Definition: Exception.cc:30
zypp::exception_detail::CodeLocation::_line
unsigned _line
Definition: Exception.h:56
zypp::exception_detail::CodeLocation::_func
std::string _func
Definition: Exception.h:55