/***************************************************************************
* GException.cpp - exception handlers *
* ----------------------------------------------------------------------- *
* copyright (C) 2006-2017 by Juergen Knoedlseder *
* ----------------------------------------------------------------------- *
* *
* This program is free software: you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation, either version 3 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see . *
* *
***************************************************************************/
/**
* @file GException.cpp
* @brief Exception handler interface implementation
* @author J. Knoedlseder
*/
/* __ Includes ___________________________________________________________ */
#include "GException.hpp"
#include "GTools.hpp"
/***********************************************************************//**
* @brief Exception message.
***************************************************************************/
const char* GExceptionHandler::what() const throw()
{
// Set error message
std::string message = "*** ERROR in " + m_origin + ": " + m_message;
// Return message as C character array
return (gammalib::tochar(message));
}
/***********************************************************************//**
* @brief Invalid value
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Error message.
***************************************************************************/
GException::invalid_value::invalid_value(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Invalid value.";
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief Invalid argument
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Error message.
***************************************************************************/
GException::invalid_argument::invalid_argument(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Invalid argument.";
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief Invalid return value
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Error message.
***************************************************************************/
GException::invalid_return_value::invalid_return_value(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Invalid return value.";
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief Index is out of range [0,elements-1]
*
* @param[in] origin Method throwing the exception.
* @param[in] what Describes what is out of range.
* @param[in] index Index.
* @param[in] elements Number of elements.
* @param[in] message Optional error message.
*
* The @p what string specifies the index type that is out of range. For
* example what="Vector index" will lead to "Vector index is ...".
* The first letter in @p what is expected to be a capital letter.
***************************************************************************/
GException::out_of_range::out_of_range(const std::string& origin,
const std::string& what,
const int& index,
const int& elements,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message
if (elements > 0) {
m_message = gammalib::strip_whitespace(what) + " " +
gammalib::str(index) + " is outside the"
" valid range [0," + gammalib::str(elements-1) + "].";
}
else {
m_message = "Invalid access to empty object with " +
gammalib::tolower(gammalib::strip_whitespace(what)) +
" " + gammalib::str(index) + ".";
}
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief Runtime error
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Error message.
***************************************************************************/
GException::runtime_error::runtime_error(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Runtime error.";
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief File error
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Error message.
***************************************************************************/
GException::file_error::file_error(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "File error.";
if (message.length() > 0) {
m_message += (" " + message);
}
// Return
return;
}
/***********************************************************************//**
* @brief Feature not implement
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Optional message.
*
* This exception signals features that are not yet implemented. It may be
* thrown by modules that are still under development.
***************************************************************************/
GException::feature_not_implemented::feature_not_implemented(const std::string& origin,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
if (message.length() > 0) {
m_message = message;
}
else {
m_message = "Feature not implemented.";
}
m_message += " In case that you need this feature for your application"
" please submit a feature request on"
" https://cta-redmine.irap.omp.eu/projects/gammalib/,"
" join this error message and provide a detailed"
" description of your needs.";
// Return
return;
}
/***********************************************************************//**
* @brief Invalid argument
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] argument Argument name.
* @param[in] message Optional message.
*
* This exception signals that a specified argument was not valid.
***************************************************************************/
GException::invalid_argument::invalid_argument(const std::string& origin,
const std::string& argument,
const std::string& message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Invalid argument \""+argument+"\" value.";
// Add optional error message
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Invalid type conversion
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] message Optional message.
***************************************************************************/
GException::bad_type::bad_type(std::string origin, std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Invalid type conversion.";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Environment variable not found
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] envname Name of environment variable.
* @param[in] message Optional message.
*
* This exception signals that are required environment variable was not
* found.
***************************************************************************/
GException::env_not_found::env_not_found(std::string origin,
std::string envname,
std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Environment variable \""+envname+"\" not found.";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Memory allocation exception.
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] num Requested amount of memory.
***************************************************************************/
GException::mem_alloc::mem_alloc(std::string origin, unsigned num)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Memory allocation error (" + gammalib::str((int)num) + " elements)";
// Return
return;
}
/***********************************************************************//**
* @brief Not enough nodes in node array
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] num Number of nodes in node array.
***************************************************************************/
GException::not_enough_nodes::not_enough_nodes(std::string origin, int num)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Not enough nodes in node array (" + gammalib::str(num) + " nodes).";
// Return
return;
}
/***********************************************************************//**
* @brief File not found
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] filename Filename.
* @param[in] message Optional message.
***************************************************************************/
GException::file_not_found::file_not_found(std::string origin,
std::string filename,
std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "File \"" + filename +"\" not found.";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief File open error
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] filename Filename.
* @param[in] message Optional message.
***************************************************************************/
GException::file_open_error::file_open_error(std::string origin,
std::string filename,
std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Unable to open file \"" + filename +"\"";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Directory not found
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] dirname Directory name.
* @param[in] message Optional message.
***************************************************************************/
GException::directory_not_found::directory_not_found(std::string origin,
std::string dirname,
std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Directory \"" + dirname +"\" not found.";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Directory not accessible
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] dirname Directory name.
* @param[in] message Optional message.
***************************************************************************/
GException::directory_not_accessible::directory_not_accessible(std::string origin,
std::string dirname,
std::string message)
{
// Set origin
m_origin = origin;
// Set message string
m_message = "Directory \"" + dirname +"\" not accessible.";
if (message.length() > 0) {
m_message += " " + message;
}
// Return
return;
}
/***********************************************************************//**
* @brief Bad CSV columns encountered
*
* @param[in] origin Name of method that has thrown the exception.
* @param[in] filename Filename.
* @param[in] row CSV file row.
* @param[in] cols Expected number of columns.
* @param[in] elements Found number of columns.
* @param[in] message Optional message.
***************************************************************************/
GException::csv_bad_columns::csv_bad_columns(std::string origin,
std::string filename,
int row,
int cols,
int elements,
std::string message)
{
m_origin = origin;
m_message = "Inconsistent number of columns found in row "+gammalib::str(row)+
" of file \""+filename+"\" ("+gammalib::str(cols)+" expected, "+
gammalib::str(elements)+" encountered). "+message;
return;
}