23#ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_EXCEPTION_IMPL_
24#error "This file should not be included directly! Use ElementsKernel/Exception.h instead"
37template <
typename... Args>
38Exception::Exception(
const char* string_format, Args&&... args) : m_exit_code{ExitCodeHelper<Args...>{args...}.code} {
40 char* message =
new char[len];
47void Exception::appendMessage(
const T& message) {
49 new_message << m_error_msg << message;
50 m_error_msg = new_message.
str();
53template <
typename Last>
54Exception::ExitCodeHelper<Last>::ExitCodeHelper(
const Last& last) : code{getCode(last)} {}
56template <
typename Last>
57template <typename T, typename std::enable_if<std::is_same<T, ExitCode>::value>::type*>
58ExitCode Exception::ExitCodeHelper<Last>::getCode(
const T& t) {
62template <
typename Last>
63template <typename T, typename std::enable_if<not std::is_same<T, ExitCode>::value>::type*>
64ExitCode Exception::ExitCodeHelper<Last>::getCode(
const T&) {
65 return ExitCode::NOT_OK;
68template <
typename First,
typename... Rest>
69Exception::ExitCodeHelper<First, Rest...>::ExitCodeHelper(
const First&,
const Rest&... rest)
70 : Exception::ExitCodeHelper<Rest...>::template ExitCodeHelper<Rest...>(rest...) {}
72template <
typename Ex,
typename T,
typename>
74 ex.appendMessage(message);
define a list of standard exit codes for executables
Exception(ExitCode e=ExitCode::NOT_OK)
ExitCode
Strongly typed exit numbers.
ELEMENTS_API std::ostream & operator<<(std::ostream &, const Environment::Variable &)