diff --git a/aleth/main.cpp b/aleth/main.cpp index 99094c8a82e..9d03ef1e4a2 100644 --- a/aleth/main.cpp +++ b/aleth/main.cpp @@ -687,9 +687,10 @@ int main(int argc, char** argv) } catch (...) { - cerr << "provided configuration is not well formatted\n"; - cerr << "sample: \n" << genesisInfo(eth::Network::MainNetworkTest) << "\n"; - return AlethErrors::Success; + cerr << "provided configuration is not well-formatted\n"; + cerr << "well-formatted sample: \n" + << genesisInfo(eth::Network::MainNetworkTest) << "\n"; + return AlethErrors::ConfigFileInvalid; } } diff --git a/libdevcore/Exceptions.h b/libdevcore/Exceptions.h index 8555287fe8d..bf73bc545e3 100644 --- a/libdevcore/Exceptions.h +++ b/libdevcore/Exceptions.h @@ -70,6 +70,7 @@ DEV_SIMPLE_EXCEPTION(FailedInvariant); DEV_SIMPLE_EXCEPTION(ValueTooLarge); DEV_SIMPLE_EXCEPTION(UnknownField); DEV_SIMPLE_EXCEPTION(MissingField); +DEV_SIMPLE_EXCEPTION(SyntaxError); DEV_SIMPLE_EXCEPTION(WrongFieldType); DEV_SIMPLE_EXCEPTION(InterfaceNotSupported); DEV_SIMPLE_EXCEPTION(ExternalFunctionFailure); diff --git a/libethcore/Common.h b/libethcore/Common.h index 1f959134ca9..2b14b4c62af 100644 --- a/libethcore/Common.h +++ b/libethcore/Common.h @@ -226,6 +226,7 @@ enum AlethErrors UnknownArgument, UnknownMiningOption, ConfigFileEmptyOrNotFound, + ConfigFileInvalid, UnknownNetworkType, BadNetworkIdOption, BadConfigOption, diff --git a/libethereum/ChainParams.cpp b/libethereum/ChainParams.cpp index 1b20ded188e..cb65b416ffb 100644 --- a/libethereum/ChainParams.cpp +++ b/libethereum/ChainParams.cpp @@ -59,7 +59,20 @@ ChainParams ChainParams::loadConfig( { ChainParams cp(*this); js::mValue val; - js::read_string_or_throw(_json, val); + + try + { + js::read_string_or_throw(_json, val); + } + catch (js::Error_position const& error) + { + std::string const comment = "json parsing error detected on line " + + std::to_string(error.line_) + " in column " + + std::to_string(error.column_) + ": " + error.reason_; + std::cerr << comment << "\n"; + BOOST_THROW_EXCEPTION(SyntaxError() << errinfo_comment(comment)); + } + js::mObject obj = val.get_obj(); validateConfigJson(obj);