gdcm/Source/Common/gdcmException.h

109 lines
3.3 KiB
C++

/*=========================================================================
Program: GDCM (Grassroots DICOM). A DICOM library
Copyright (c) 2006-2011 Mathieu Malaterre
All rights reserved.
See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
#ifndef GDCMEXCEPTION_H
#define GDCMEXCEPTION_H
#include <cassert>
#include <cstdlib> // NULL
#include <exception>
#include <sstream> // ostringstream
#include <stdexcept> // logic_error
#include <string>
// Disable clang warning "dynamic exception specifications are deprecated".
// We need to be C++03 and C++11 compatible, and if we remove the 'throw()'
// specifier we'll get an error in C++03 by not matching the superclass.
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wdeprecated")
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wdeprecated"
# endif
#endif
namespace gdcm
{
/**
* \brief Exception
* \details Standard exception handling object.
* \note Its copy-constructor and assignment operator are generated by the
* compiler.
*/
class Exception : public std::exception
{
/// std::logic_error is used to internally hold a string.
/// It has the nice property of having a copy-constructor
/// that never fails. Thereby it provides the same guarantee to
/// the copy-constructor of gdcm::Exception.
typedef std::logic_error StringHolder;
/// Creates the text to be returned by Exception:what().
static StringHolder CreateWhat(const char* const desc,
const char* const file,
const unsigned int lineNumber,
const char* const func)
{
assert(desc != nullptr);
assert(file != nullptr);
assert(func != nullptr);
std::ostringstream oswhat;
oswhat << file << ":" << lineNumber << " (" << func << "):\n";
oswhat << desc;
return StringHolder( oswhat.str() );
}
public:
/// Explicit constructor, initializing the description and the
/// text returned by what().
/// \note The last parameter is ignored for the time being.
/// It may be used to specify the function where the exception
/// was thrown.
explicit Exception(const char *desc = "None",
const char *file = __FILE__,
unsigned int lineNumber = __LINE__,
// FIXME: __PRETTY_FUNCTION__ is the non-mangled version for __GNUC__ compiler
const char *func = "" /*__FUNCTION__*/)
:
What( CreateWhat(desc, file, lineNumber, func) ),
Description(desc)
{
}
~Exception() throw() override {}
/// what implementation
const char* what() const throw() override
{
return What.what();
}
/// Return the Description
const char * GetDescription() const { return Description.what(); }
private:
StringHolder What;
StringHolder Description;
};
} // end namespace gdcm
// Undo warning suppression.
#if defined(__clang__) && defined(__has_warning)
# if __has_warning("-Wdeprecated")
# pragma clang diagnostic pop
# endif
#endif
#endif