You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
243 lines
7.7 KiB
243 lines
7.7 KiB
// Copyright Vladimir Prus 2002-2004. |
|
// Distributed under the Boost Software License, Version 1.0. |
|
// (See accompanying file LICENSE_1_0.txt |
|
// or copy at http://www.boost.org/LICENSE_1_0.txt) |
|
|
|
|
|
#ifndef BOOST_ERRORS_VP_2003_01_02 |
|
#define BOOST_ERRORS_VP_2003_01_02 |
|
|
|
#include <boost/program_options/config.hpp> |
|
|
|
#include <string> |
|
#include <stdexcept> |
|
#include <vector> |
|
|
|
#if defined(BOOST_MSVC) |
|
# pragma warning (push) |
|
# pragma warning (disable:4275) // non dll-interface class 'std::logic_error' used as base for dll-interface class 'boost::program_options::error' |
|
# pragma warning (disable:4251) // class 'std::vector<_Ty>' needs to have dll-interface to be used by clients of class 'boost::program_options::ambiguous_option' |
|
#endif |
|
|
|
namespace boost { namespace program_options { |
|
|
|
/** Base class for all errors in the library. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL error : public std::logic_error { |
|
public: |
|
error(const std::string& xwhat) : std::logic_error(xwhat) {} |
|
}; |
|
|
|
class BOOST_PROGRAM_OPTIONS_DECL invalid_syntax : public error { |
|
public: |
|
enum kind_t { |
|
long_not_allowed = 30, |
|
long_adjacent_not_allowed, |
|
short_adjacent_not_allowed, |
|
empty_adjacent_parameter, |
|
missing_parameter, |
|
extra_parameter, |
|
unrecognized_line |
|
}; |
|
|
|
invalid_syntax(const std::string& tokens, kind_t kind); |
|
|
|
// gcc says that throw specification on dtor is loosened |
|
// without this line |
|
~invalid_syntax() throw() {} |
|
|
|
kind_t kind() const; |
|
|
|
const std::string& tokens() const; |
|
|
|
protected: |
|
/** Used to convert kind_t to a related error text */ |
|
static std::string error_message(kind_t kind); |
|
|
|
private: |
|
// TODO: copy ctor might throw |
|
std::string m_tokens; |
|
|
|
kind_t m_kind; |
|
}; |
|
|
|
/** Class thrown when option name is not recognized. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL unknown_option : public error { |
|
public: |
|
unknown_option(const std::string& name) |
|
: error(std::string("unknown option ").append(name)), |
|
m_option_name(name) |
|
{} |
|
|
|
// gcc says that throw specification on dtor is loosened |
|
// without this line |
|
~unknown_option() throw() {} |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
private: |
|
std::string m_option_name; |
|
}; |
|
|
|
/** Class thrown when there's ambiguity amoung several possible options. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL ambiguous_option : public error { |
|
public: |
|
ambiguous_option(const std::string& name, |
|
const std::vector<std::string>& xalternatives) |
|
: error(std::string("ambiguous option ").append(name)) |
|
, m_alternatives(xalternatives) |
|
, m_option_name(name) |
|
{} |
|
|
|
~ambiguous_option() throw() {} |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
const std::vector<std::string>& alternatives() const throw(); |
|
|
|
private: |
|
// TODO: copy ctor might throw |
|
std::vector<std::string> m_alternatives; |
|
std::string m_option_name; |
|
}; |
|
|
|
/** Class thrown when there are several option values, but |
|
user called a method which cannot return them all. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL multiple_values : public error { |
|
public: |
|
multiple_values() |
|
: error("multiple values") |
|
, m_option_name() {} |
|
|
|
~multiple_values() throw() {} |
|
|
|
void set_option_name(const std::string& option); |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
private: |
|
std::string m_option_name; // The name of the option which |
|
// caused the exception. |
|
}; |
|
|
|
/** Class thrown when there are several occurrences of an |
|
option, but user called a method which cannot return |
|
them all. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL multiple_occurrences : public error { |
|
public: |
|
multiple_occurrences() |
|
: error("multiple occurrences") |
|
, m_option_name() {} |
|
|
|
~multiple_occurrences() throw() {} |
|
|
|
void set_option_name(const std::string& option); |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
private: |
|
std::string m_option_name; // The name of the option which |
|
// caused the exception. |
|
}; |
|
|
|
/** Class thrown when value of option is incorrect. */ |
|
class BOOST_PROGRAM_OPTIONS_DECL validation_error : public error { |
|
public: |
|
enum kind_t { |
|
multiple_values_not_allowed = 30, |
|
at_least_one_value_required, |
|
invalid_bool_value, |
|
invalid_option_value, |
|
invalid_option |
|
}; |
|
|
|
validation_error(kind_t kind, |
|
const std::string& option_value = "", |
|
const std::string& option_name = ""); |
|
|
|
~validation_error() throw() {} |
|
|
|
void set_option_name(const std::string& option); |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
const char* what() const throw(); |
|
|
|
protected: |
|
/** Used to convert kind_t to a related error text */ |
|
static std::string error_message(kind_t kind); |
|
|
|
private: |
|
kind_t m_kind; |
|
std::string m_option_name; // The name of the option which |
|
// caused the exception. |
|
std::string m_option_value; // Optional: value of the option m_options_name |
|
mutable std::string m_message; // For on-demand formatting in 'what' |
|
|
|
}; |
|
|
|
/** Class thrown if there is an invalid option value givenn */ |
|
class BOOST_PROGRAM_OPTIONS_DECL invalid_option_value |
|
: public validation_error |
|
{ |
|
public: |
|
invalid_option_value(const std::string& value); |
|
#ifndef BOOST_NO_STD_WSTRING |
|
invalid_option_value(const std::wstring& value); |
|
#endif |
|
}; |
|
|
|
/** Class thrown when there are too many positional options. |
|
This is a programming error. |
|
*/ |
|
class BOOST_PROGRAM_OPTIONS_DECL too_many_positional_options_error : public error { |
|
public: |
|
too_many_positional_options_error() |
|
: error("too many positional options") |
|
{} |
|
}; |
|
|
|
/** Class thrown when there are syntax errors in given command line */ |
|
class BOOST_PROGRAM_OPTIONS_DECL invalid_command_line_syntax : public invalid_syntax { |
|
public: |
|
invalid_command_line_syntax(const std::string& tokens, kind_t kind); |
|
}; |
|
|
|
/** Class thrown when there are programming error related to style */ |
|
class BOOST_PROGRAM_OPTIONS_DECL invalid_command_line_style : public error { |
|
public: |
|
invalid_command_line_style(const std::string& msg) |
|
: error(msg) |
|
{} |
|
}; |
|
|
|
/** Class thrown if config file can not be read */ |
|
class BOOST_PROGRAM_OPTIONS_DECL reading_file : public error { |
|
public: |
|
reading_file(const char* filename) |
|
: error(std::string("can not read file ").append(filename)) |
|
{} |
|
}; |
|
|
|
/** Class thrown when a required/mandatory option is missing */ |
|
class BOOST_PROGRAM_OPTIONS_DECL required_option : public error { |
|
public: |
|
required_option(const std::string& name) |
|
: error(std::string("missing required option ").append(name)) |
|
, m_option_name(name) |
|
{} |
|
|
|
~required_option() throw() {} |
|
|
|
const std::string& get_option_name() const throw(); |
|
|
|
private: |
|
std::string m_option_name; // The name of the option which |
|
// caused the exception. |
|
}; |
|
}} |
|
|
|
#if defined(BOOST_MSVC) |
|
# pragma warning (pop) |
|
#endif |
|
|
|
#endif
|
|
|