Unifies interface of OpmInputError::OpmInputError()
This commit is contained in:
@@ -66,10 +66,15 @@ public:
|
||||
OpmInputError("Error at line {line} in file {file} - keyword: {keyword} has invalid argument {}", invalid_argument);
|
||||
*/
|
||||
|
||||
OpmInputError(const std::string& msg_fmt, const KeywordLocation& loc) :
|
||||
m_what { OpmInputError::format(msg_fmt, loc) },
|
||||
locations { loc }
|
||||
{}
|
||||
template<typename ... Args>
|
||||
OpmInputError(const std::string& reason, const KeywordLocation& location, const Args& ...furtherLocations)
|
||||
: locations { location, furtherLocations... }
|
||||
, m_what {
|
||||
locations.size() == 1
|
||||
? formatSingle(reason, locations[0])
|
||||
: formatMultiple(reason, locations)
|
||||
}
|
||||
{ }
|
||||
|
||||
/*
|
||||
Allows for the initialisation of an OpmInputError from another exception.
|
||||
@@ -83,27 +88,13 @@ public:
|
||||
} catch (const Opm::OpmInputError&) {
|
||||
throw;
|
||||
} catch (const std::exception& e) {
|
||||
std::throw_with_nested(Opm::OpmInputError(location, e));
|
||||
std::throw_with_nested(Opm::OpmInputError(e, location));
|
||||
}
|
||||
*/
|
||||
OpmInputError(const KeywordLocation& loc, const std::exception& e) :
|
||||
m_what { OpmInputError::formatException(loc, e) },
|
||||
locations { loc }
|
||||
{}
|
||||
|
||||
OpmInputError(const KeywordLocation& loc, const std::string& reason)
|
||||
: m_what { OpmInputError::formatSingle(reason, loc) }
|
||||
, locations { loc }
|
||||
{}
|
||||
|
||||
OpmInputError(const std::vector<KeywordLocation>& locations, const std::string& reason)
|
||||
: m_what {
|
||||
locations.size() == 1
|
||||
? OpmInputError::formatSingle(reason, locations[0])
|
||||
: OpmInputError::formatMultiple(reason, locations)
|
||||
}
|
||||
, locations { locations }
|
||||
{}
|
||||
OpmInputError(const std::exception& error, const KeywordLocation& location)
|
||||
: locations { location }
|
||||
, m_what { formatException(error, locations[0]) }
|
||||
{ }
|
||||
|
||||
const char * what() const throw()
|
||||
{
|
||||
@@ -112,16 +103,16 @@ public:
|
||||
|
||||
|
||||
static std::string format(const std::string& msg_format, const KeywordLocation& loc);
|
||||
static std::string formatException(const KeywordLocation& loc, const std::exception& e);
|
||||
static std::string formatException(const std::exception& e, const KeywordLocation& loc);
|
||||
|
||||
private:
|
||||
std::string m_what;
|
||||
|
||||
// The location member is here for debugging; depending on the msg_fmt
|
||||
// passed in the constructor we might not have captured all the information
|
||||
// in the location argument passed to the constructor.
|
||||
std::vector<KeywordLocation> locations;
|
||||
|
||||
std::string m_what;
|
||||
|
||||
static std::string formatSingle(const std::string& reason, const KeywordLocation&);
|
||||
static std::string formatMultiple(const std::string& reason, const std::vector<KeywordLocation>&);
|
||||
};
|
||||
|
||||
@@ -26,12 +26,26 @@
|
||||
|
||||
namespace Opm {
|
||||
|
||||
std::string OpmInputError::formatException(const KeywordLocation& loc, const std::exception& e) {
|
||||
const std::string defaultMessage { R"(Problem parsing keyword {{keyword}}
|
||||
In {{file}} line {{line}}.
|
||||
namespace {
|
||||
|
||||
template<typename ... Args>
|
||||
std::string formatImpl(const std::string& msg_format, const KeywordLocation& loc, const Args& ...arguments) {
|
||||
return fmt::format(msg_format,
|
||||
arguments...,
|
||||
fmt::arg("keyword", loc.keyword),
|
||||
fmt::arg("file", loc.filename),
|
||||
fmt::arg("line", loc.lineno)
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
std::string OpmInputError::formatException(const std::exception& e, const KeywordLocation& loc) {
|
||||
const std::string defaultMessage { R"(Problem parsing keyword {keyword}
|
||||
In {file} line {line}.
|
||||
Internal error: {})" } ;
|
||||
|
||||
return format(fmt::format(defaultMessage, e.what()), loc);
|
||||
return formatImpl(defaultMessage, loc, e.what());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -42,26 +56,23 @@ Internal error: {})" } ;
|
||||
the fmtlib dependendcy will be imposed on downstream modules.
|
||||
*/
|
||||
std::string OpmInputError::format(const std::string& msg_format, const KeywordLocation& loc) {
|
||||
return fmt::format(msg_format,
|
||||
fmt::arg("keyword", loc.keyword),
|
||||
fmt::arg("file", loc.filename),
|
||||
fmt::arg("line", loc.lineno)
|
||||
);
|
||||
return formatImpl(msg_format, loc);
|
||||
}
|
||||
|
||||
std::string OpmInputError::formatSingle(const std::string& reason, const KeywordLocation& location) {
|
||||
const std::string defaultMessage { R"(Problem parsing keyword {keyword}
|
||||
In {file} line {line}
|
||||
Parse error: {})" } ;
|
||||
|
||||
return formatImpl(defaultMessage, location, reason);
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
std::string locationStringLine(const KeywordLocation& loc) {
|
||||
return OpmInputError::format("\n {keyword} in {file}, line {line}", loc);
|
||||
}
|
||||
std::string locationStringLine(const KeywordLocation& loc) {
|
||||
return OpmInputError::format("\n {keyword} in {file}, line {line}", loc);
|
||||
}
|
||||
|
||||
std::string OpmInputError::formatSingle(const std::string& reason, const KeywordLocation& location) {
|
||||
const std::string defaultMessage { R"(Problem parsing keyword {{keyword}}
|
||||
In {{file}} line {{line}}
|
||||
Parse error: {})" } ;
|
||||
|
||||
return format(fmt::format(defaultMessage, reason), location);
|
||||
}
|
||||
|
||||
std::string OpmInputError::formatMultiple(const std::string& reason, const std::vector<KeywordLocation>& locations) {
|
||||
|
||||
@@ -861,7 +861,7 @@ void FieldProps::handle_operation(const DeckKeyword& keyword, Box box) {
|
||||
continue;
|
||||
}
|
||||
|
||||
throw OpmInputError(keyword.location(), "Operation keyword " + keyword.name() + " does not support the keyword " + target_kw);
|
||||
throw OpmInputError("Operation keyword " + keyword.name() + " does not support the keyword " + target_kw, keyword.location());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1767,7 +1767,7 @@ namespace {
|
||||
} catch (const OpmInputError&) {
|
||||
throw;
|
||||
} catch (const std::exception& e) {
|
||||
OpmLog::error(OpmInputError::formatException(handlerContext.keyword.location(), e));
|
||||
OpmLog::error(OpmInputError::formatException(e, handlerContext.keyword.location()));
|
||||
|
||||
throw;
|
||||
}
|
||||
|
||||
@@ -577,10 +577,7 @@ namespace Opm {
|
||||
hasRTEMPVD { deck.hasKeyword<ParserKeywords::RTEMPVD>() } ;
|
||||
|
||||
if (hasTEMPVD && hasRTEMPVD) {
|
||||
throw OpmInputError({
|
||||
deck.getKeyword<ParserKeywords::TEMPVD>().location(),
|
||||
deck.getKeyword<ParserKeywords::RTEMPVD>().location(),
|
||||
}, "The TEMPVD and RTEMPVD tables are mutually exclusive.");
|
||||
throw OpmInputError("The TEMPVD and RTEMPVD tables are mutually exclusive.", deck.getKeyword<ParserKeywords::TEMPVD>().location(), deck.getKeyword<ParserKeywords::RTEMPVD>().location());
|
||||
} else if (hasTEMPVD) {
|
||||
initSimpleTableContainer<RtempvdTable>(deck, "TEMPVD", "RTEMPVD", m_eqldims.getNumEquilRegions());
|
||||
} else if (hasRTEMPVD) {
|
||||
@@ -636,7 +633,7 @@ namespace Opm {
|
||||
"The Parser does currently NOT support the alternating record schema used in PLYSHLOG"
|
||||
} ;
|
||||
|
||||
throw OpmInputError(tableKeyword.location(), reason);
|
||||
throw OpmInputError(reason, tableKeyword.location());
|
||||
}
|
||||
|
||||
for (size_t tableIdx = 0; tableIdx < tableKeyword.size(); tableIdx += 2) {
|
||||
@@ -675,7 +672,7 @@ namespace Opm {
|
||||
" for keyword PLYMWINJ found"
|
||||
} ;
|
||||
|
||||
throw OpmInputError(keyword.location(), reason);
|
||||
throw OpmInputError(reason, keyword.location());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -705,7 +702,7 @@ namespace Opm {
|
||||
" for keyword SKPRWAT found"
|
||||
} ;
|
||||
|
||||
throw OpmInputError(keyword.location(), reason);
|
||||
throw OpmInputError(reason, keyword.location());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -735,7 +732,7 @@ namespace Opm {
|
||||
" for keyword SKPRPOLY found"
|
||||
} ;
|
||||
|
||||
throw OpmInputError(keyword.location(), reason);
|
||||
throw OpmInputError(reason, keyword.location());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -807,7 +804,7 @@ namespace Opm {
|
||||
"Make sure that your ROCKTAB table only has 3 columns)"
|
||||
} ;
|
||||
|
||||
throw OpmInputError(keyword.location(), reason);
|
||||
throw OpmInputError(reason, keyword.location());
|
||||
}
|
||||
|
||||
bool useStressOption = false;
|
||||
@@ -820,7 +817,7 @@ namespace Opm {
|
||||
if (useStressOption) {
|
||||
const std::string reason { "STRESS option is set in ROCKOPTS. Flow does not support stress option in rock compaction mulipliers" } ;
|
||||
|
||||
throw OpmInputError(rockoptsKeyword.location(), reason);
|
||||
throw OpmInputError(reason, rockoptsKeyword.location());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -935,7 +935,7 @@ bool parseState( ParserState& parserState, const Parser& parser ) {
|
||||
exception.
|
||||
*/
|
||||
|
||||
OpmLog::error(OpmInputError::formatException(rawKeyword->location(), e));
|
||||
OpmLog::error(OpmInputError::formatException(e, rawKeyword->location()));
|
||||
|
||||
throw;
|
||||
}
|
||||
|
||||
@@ -848,9 +848,6 @@ BOOST_AUTO_TEST_CASE(OPM_ERROR) {
|
||||
OpmInputError error1("Error", location);
|
||||
OpmInputError error4("{keyword}:{line}:{keyword}", location);
|
||||
|
||||
BOOST_CHECK_EQUAL(error1.what(), "Error");
|
||||
BOOST_CHECK_EQUAL(error4.what(), "kw:100:kw");
|
||||
|
||||
/*
|
||||
This test is meant to emulate the typical parsing process, the blocks here
|
||||
in the main test function represent main() in the simulator and the main
|
||||
|
||||
@@ -54,7 +54,7 @@ BOOST_AUTO_TEST_CASE(exception) {
|
||||
In FILENAME.DAT line 42.
|
||||
Internal error: Runtime Error)" };
|
||||
|
||||
const std::string formatted { Opm::OpmInputError::formatException(location, std::runtime_error("Runtime Error")) } ;
|
||||
const std::string formatted { Opm::OpmInputError::formatException(std::runtime_error("Runtime Error"), location) } ;
|
||||
|
||||
BOOST_CHECK_EQUAL(formatted, expected);
|
||||
}
|
||||
@@ -64,7 +64,7 @@ BOOST_AUTO_TEST_CASE(exception_reason) {
|
||||
In FILENAME.DAT line 42.
|
||||
Internal error: Runtime Error)" };
|
||||
|
||||
const std::string formatted { Opm::OpmInputError::formatException(location, std::runtime_error("Runtime Error")) } ;
|
||||
const std::string formatted { Opm::OpmInputError::formatException(std::runtime_error("Runtime Error"), location) } ;
|
||||
|
||||
BOOST_CHECK_EQUAL(formatted, expected);
|
||||
}
|
||||
@@ -74,7 +74,7 @@ BOOST_AUTO_TEST_CASE(exception_init) {
|
||||
In FILENAME.DAT line 42.
|
||||
Internal error: Runtime Error)" };
|
||||
|
||||
const std::string formatted { Opm::OpmInputError(location, std::runtime_error("Runtime Error")).what() } ;
|
||||
const std::string formatted { Opm::OpmInputError(std::runtime_error("Runtime Error"), location).what() } ;
|
||||
|
||||
BOOST_CHECK_EQUAL(formatted, expected);
|
||||
}
|
||||
@@ -88,7 +88,7 @@ Internal error: Runtime Error)" };
|
||||
try {
|
||||
throw std::runtime_error("Runtime Error");
|
||||
} catch (const std::exception& e) {
|
||||
std::throw_with_nested(Opm::OpmInputError(location, e));
|
||||
std::throw_with_nested(Opm::OpmInputError(e, location));
|
||||
}
|
||||
} catch (const Opm::OpmInputError& opm_error) {
|
||||
BOOST_CHECK_EQUAL(opm_error.what(), expected);
|
||||
@@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(exception_multi_1) {
|
||||
In FILENAME.DAT line 42
|
||||
Parse error: Runtime Error)" } ;
|
||||
|
||||
const std::string formatted { Opm::OpmInputError({ location }, "Runtime Error").what() } ;
|
||||
const std::string formatted { Opm::OpmInputError("Runtime Error", location).what() } ;
|
||||
|
||||
BOOST_CHECK_EQUAL(formatted, expected);
|
||||
}
|
||||
@@ -113,7 +113,7 @@ BOOST_AUTO_TEST_CASE(exception_multi_2) {
|
||||
MZUNSUPP in FILENAME.DAT, line 45
|
||||
Parse error: Runtime Error)" } ;
|
||||
|
||||
const std::string formatted { Opm::OpmInputError({ location, location2 }, "Runtime Error").what() } ;
|
||||
const std::string formatted { Opm::OpmInputError("Runtime Error", location, location2).what() } ;
|
||||
|
||||
BOOST_CHECK_EQUAL(formatted, expected);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user