Commit d13a6445 authored by Max Kellermann's avatar Max Kellermann

config/File: use nested exception to annotate file name and line number

parent 816603fd
/* /*
* Copyright 2003-2017 The Music Player Daemon Project * Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org * http://www.musicpd.org
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
...@@ -65,7 +65,7 @@ config_read_name_value(ConfigBlock &block, char *input, unsigned line) ...@@ -65,7 +65,7 @@ config_read_name_value(ConfigBlock &block, char *input, unsigned line)
static ConfigBlock * static ConfigBlock *
config_read_block(BufferedReader &reader) config_read_block(BufferedReader &reader)
try { {
std::unique_ptr<ConfigBlock> block(new ConfigBlock(reader.GetLineNumber())); std::unique_ptr<ConfigBlock> block(new ConfigBlock(reader.GetLineNumber()));
while (true) { while (true) {
...@@ -93,8 +93,6 @@ try { ...@@ -93,8 +93,6 @@ try {
config_read_name_value(*block, line, config_read_name_value(*block, line,
reader.GetLineNumber()); reader.GetLineNumber());
} }
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Error in line %u", reader.GetLineNumber()));
} }
gcc_nonnull_all gcc_nonnull_all
...@@ -130,13 +128,11 @@ ReadConfigBlock(ConfigData &config_data, BufferedReader &reader, ...@@ -130,13 +128,11 @@ ReadConfigBlock(ConfigData &config_data, BufferedReader &reader,
/* now parse the block or the value */ /* now parse the block or the value */
if (tokenizer.CurrentChar() != '{') if (tokenizer.CurrentChar() != '{')
throw FormatRuntimeError("line %u: '{' expected", throw std::runtime_error("'{' expected");
reader.GetLineNumber());
char *line = StripLeft(tokenizer.Rest() + 1); char *line = StripLeft(tokenizer.Rest() + 1);
if (*line != 0 && *line != CONF_COMMENT) if (*line != 0 && *line != CONF_COMMENT)
throw FormatRuntimeError("line %u: Unknown tokens after '{'", throw std::runtime_error("Unknown tokens after '{'");
reader.GetLineNumber());
auto *param = config_read_block(reader); auto *param = config_read_block(reader);
assert(param != nullptr); assert(param != nullptr);
...@@ -177,12 +173,10 @@ ReadConfigParam(ConfigData &config_data, BufferedReader &reader, ...@@ -177,12 +173,10 @@ ReadConfigParam(ConfigData &config_data, BufferedReader &reader,
const char *value = tokenizer.NextString(); const char *value = tokenizer.NextString();
if (value == nullptr) if (value == nullptr)
throw FormatRuntimeError("line %u: Value missing", throw std::runtime_error("Value missing");
reader.GetLineNumber());
if (!tokenizer.IsEnd() && tokenizer.CurrentChar() != CONF_COMMENT) if (!tokenizer.IsEnd() && tokenizer.CurrentChar() != CONF_COMMENT)
throw FormatRuntimeError("line %u: Unknown tokens after value", throw std::runtime_error("Unknown tokens after value");
reader.GetLineNumber());
auto *param = new ConfigParam(value, reader.GetLineNumber()); auto *param = new ConfigParam(value, reader.GetLineNumber());
Append(head, param); Append(head, param);
...@@ -219,9 +213,8 @@ ReadConfigFile(ConfigData &config_data, BufferedReader &reader) ...@@ -219,9 +213,8 @@ ReadConfigFile(ConfigData &config_data, BufferedReader &reader)
ReadConfigBlock(config_data, reader, name, bo, ReadConfigBlock(config_data, reader, name, bo,
tokenizer); tokenizer);
} else { } else {
throw FormatRuntimeError("unrecognized parameter in config file at " throw FormatRuntimeError("unrecognized parameter: %s\n",
"line %u: %s\n", name);
reader.GetLineNumber(), name);
} }
} }
} }
...@@ -237,5 +230,12 @@ ReadConfigFile(ConfigData &config_data, Path path) ...@@ -237,5 +230,12 @@ ReadConfigFile(ConfigData &config_data, Path path)
FileReader file(path); FileReader file(path);
BufferedReader reader(file); BufferedReader reader(file);
try {
ReadConfigFile(config_data, reader); ReadConfigFile(config_data, reader);
} catch (...) {
std::throw_with_nested(FormatRuntimeError("Error in %s line %u",
path_utf8.c_str(),
reader.GetLineNumber()));
}
} }
/* /*
* Copyright 2003-2017 The Music Player Daemon Project * Copyright 2003-2018 The Music Player Daemon Project
* http://www.musicpd.org * http://www.musicpd.org
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment