lsst.pex.exceptions
g786e29fd12+76ce5f0d11
Toggle main menu visibility
Loading...
Searching...
No Matches
src
Exception.cc
Go to the documentation of this file.
1
/*
2
* This file is part of pex_exceptions.
3
*
4
* Developed for the LSST Data Management System.
5
* This product includes software developed by the LSST Project
6
* (https://www.lsst.org).
7
* See the COPYRIGHT file at the top-level directory of this distribution
8
* for details of code ownership.
9
*
10
* This program is free software: you can redistribute it and/or modify
11
* it under the terms of the GNU General Public License as published by
12
* the Free Software Foundation, either version 3 of the License, or
13
* (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
* GNU General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public License
21
* along with this program. If not, see <https://www.gnu.org/licenses/>.
22
*/
23
24
#ifndef __GNUC__
25
#define __attribute__(x)
/*NOTHING*/
26
#endif
27
28
#include <cstring>
29
#include <ostream>
30
#include <sstream>
31
#include <string>
32
33
#include "
lsst/pex/exceptions/Exception.h
"
34
35
namespace
lsst
{
36
namespace
pex {
37
namespace
exceptions {
38
39
Tracepoint::Tracepoint
(
char
const
* file,
int
line,
char
const
* func,
std::string
const
& message)
40
:
_file
(file),
_line
(line),
_func
(func),
_message
(message) {}
41
42
Exception::Exception
(
char
const
* file,
int
line,
char
const
* func,
std::string
const
& message)
43
: _message(message), _traceback(1,
Tracepoint
(file, line, func, message)) {}
44
45
Exception::Exception
(
std::string
const
& message) : _message(message), _traceback() {}
46
47
Exception::~Exception
(
void
)
noexcept
{}
48
49
void
Exception::addMessage
(
char
const
* file,
int
line,
char
const
* func,
std::string
const
& message) {
50
std::ostringstream
stream;
51
stream << _message;
52
if
(_traceback.empty()) {
53
// This means the message-only constructor was used, which should only happen
54
// from Python...but this method isn't accessible from Python, so maybe
55
// this Exception was thrown in Python, then passed back to C++. Or, more
56
// likely, someone didn't read the warning and threw this exception in C++
57
// without using LSST_EXCEPT.
58
// But, because we don't have a traceback for that first message, we can't
59
// add one here without messing up the stringification logic later. Since
60
// this is a rare case (and should be considered a bug, but we don't want
61
// exception code throwing its own exceptions unless it absolutely has to),
62
// we'll proceed by just appending the message and ignoring the traceback.
63
stream <<
"; "
<< message;
64
}
else
{
65
if
(_traceback.size() ==
static_cast<
std::size_t
>
(1)) {
66
// The original message doesn't have an index (because it's faster,
67
// and there's no need if there's only one), so when we add the second,
68
// we have to give it an index.
69
stream <<
" {0}; "
;
70
}
else
{
71
stream <<
"; "
;
72
}
73
stream << message <<
" {"
<< _traceback.
size
() <<
"}"
;
74
_traceback.push_back(
Tracepoint
(file, line, func, message));
75
}
76
_message = stream.
str
();
77
}
78
79
Traceback
const
&
Exception::getTraceback
(
void
)
const
noexcept
{
return
_traceback; }
80
81
std::ostream
&
Exception::addToStream
(
std::ostream
& stream)
const
{
82
if
(_traceback.empty()) {
83
// The exception was raised in Python, so we don't include the traceback, the type, or any
84
// newlines, because Python will print those itself.
85
stream << _message;
86
}
else
{
87
stream <<
std::endl
;
// Start with a newline to separate our stuff from Pythons "<type>: " prefix.
88
for
(
std::size_t
i = 0; i != _traceback.size(); ++i) {
89
stream <<
" File \""
<< _traceback[i]._file <<
"\", line "
<< _traceback[i]._line <<
", in "
90
<< _traceback[i]._func <<
std::endl
;
91
stream <<
" "
<< _traceback[i]._message <<
" {"
<< i <<
"}"
<<
std::endl
;
92
}
93
std::string
type(
getType
(), 0,
std::strlen
(
getType
()) - 2);
94
stream << type <<
": '"
<< _message <<
"'"
<<
std::endl
;
95
}
96
return
stream;
97
}
98
99
char
const
*
Exception::what
(
void
)
const
noexcept
{
return
_message.c_str(); }
100
101
char
const
*
Exception::getType
(
void
)
const
noexcept
{
return
"lsst::pex::exceptions::Exception *"
; }
102
103
Exception
*
Exception::clone
(
void
)
const
{
return
new
Exception
(*
this
); }
104
105
std::ostream
&
operator<<
(
std::ostream
& stream,
Exception
const
& e) {
return
e.
addToStream
(stream); }
106
107
}
// namespace exceptions
108
}
// namespace pex
109
}
// namespace lsst
Exception.h
std::ostream
std::ostringstream
std::string
lsst::pex::exceptions::Exception
Provides consistent interface for LSST exceptions.
Definition
Exception.h:107
lsst::pex::exceptions::Exception::addMessage
void addMessage(char const *file, int line, char const *func, std::string const &message)
Add a tracepoint and a message to an exception before rethrowing it (access via LSST_EXCEPT_ADD).
Definition
Exception.cc:49
lsst::pex::exceptions::Exception::getType
virtual char const * getType(void) const noexcept
Return the fully-specified C++ type of a pointer to the exception.
Definition
Exception.cc:101
lsst::pex::exceptions::Exception::clone
virtual Exception * clone(void) const
Return a copy of the exception as an Exception pointer.
Definition
Exception.cc:103
lsst::pex::exceptions::Exception::addToStream
virtual std::ostream & addToStream(std::ostream &stream) const
Add a text representation of this exception, including its traceback with messages,...
Definition
Exception.cc:81
lsst::pex::exceptions::Exception::~Exception
virtual ~Exception(void) noexcept
Definition
Exception.cc:47
lsst::pex::exceptions::Exception::getTraceback
Traceback const & getTraceback(void) const noexcept
Retrieve the list of tracepoints associated with an exception.
Definition
Exception.cc:79
lsst::pex::exceptions::Exception::Exception
Exception(char const *file, int line, char const *func, std::string const &message)
Standard constructor, intended for C++ use via the LSST_EXCEPT() macro.
Definition
Exception.cc:42
lsst::pex::exceptions::Exception::what
virtual char const * what(void) const noexcept
Return a character string summarizing this exception.
Definition
Exception.cc:99
std::endl
T endl(T... args)
lsst::pex::exceptions::operator<<
std::ostream & operator<<(std::ostream &stream, Exception const &e)
Push the text representation of an exception onto a stream.
Definition
Exception.cc:105
lsst::pex::exceptions::Traceback
std::vector< Tracepoint > Traceback
Definition
Exception.h:95
lsst
std::string::size
T size(T... args)
std::size_t
std::ostringstream::str
T str(T... args)
std::strlen
T strlen(T... args)
lsst::pex::exceptions::Tracepoint
One point in the Traceback vector held by Exception.
Definition
Exception.h:79
lsst::pex::exceptions::Tracepoint::_message
std::string _message
Definition
Exception.h:93
lsst::pex::exceptions::Tracepoint::_func
char const * _func
Definition
Exception.h:92
lsst::pex::exceptions::Tracepoint::_line
int _line
Definition
Exception.h:91
lsst::pex::exceptions::Tracepoint::_file
char const * _file
Definition
Exception.h:90
lsst::pex::exceptions::Tracepoint::Tracepoint
Tracepoint(char const *file, int line, char const *func, std::string const &message)
Standard constructor, intended for C++ use.
Definition
Exception.cc:39
Generated on
for lsst.pex.exceptions by
1.17.0