Код: Выделить всё
void foo()
{
Configuration conf = loadConfigurationFile("/path/to/configuration/conf.json");
doStuff(conf);
}
< /code>
с файлом конфигурации, который выглядит так: < /p>
{
"fields": [
{
"label": "SomeField",
"type": "int",
"value": 5
},
{
"label": "SomeOtherField",
"type": "float",
"value": 3.1
},
{
"label": "YetAnotherField",
"type": "float",
"value": 8
}
]
}
< /code>
, который анализируется с использованием библиотеки JSON, предлагая функции, позволяющие писать такие вещи, как: < /p>
auto const allFields = jsonObject.getItem("fields");
auto const fieldArray = allFields.asArray();
auto const field = auto const fieldArray[0];
auto const value = field.getItem("value");
...
< /code>
Теперь разработчик не может гарантировать во время кодирования, что файл конфигурации будет хорошо сформирован. Например, возможно, значение отсутствует для одного из параметров: < /p>
{
"label": "SomeField",
"type": "int"
}
< /code>
Поэтому существует необходимость в обработке ошибок. < /p>
Я понимаю, как это можно сделать с помощью кодов ошибок: < /p>
[*] API библиотеки будет немного отличаться, с вызовами функции, такими как:
int errCode = field.getItem(&value, "value");
[*] То же самое относится и к LoadConfigurationFile () :
Код: Выделить всё
int errCode = loadConfigurationFile(&conf, "/path/to/configuration/conf.json");
[*] с «значением», отсутствующий, он должен был вернуть ненулевую ошибку и сообщать о том, что полюдное «некоторое место и сообщение об ошибке, изменение глобальной переменной, изменение параметра, передаваемого функции ...) < /li>
< /ul>
Теперь, за исключением, насколько я понимаю: < /p>
Они предназначены для того, чтобы привести к меньшему количеству кода, и не может быть прочтено, так же, как и в Br /Li>
.
Код: Выделить всё
auto const value = field.getItem("value");
[*] Исключения распространяются, поэтому вам нужно только написать код, чтобы бросить вещи внизу, где обнаруживаются ошибки, и попробуйте /
Код: Выделить всё
catch
Код: Выделить всё
void foo()
{
try
{
Configuration conf = loadConfigurationFile("/path/to/configuration/conf.json");
doStuff(conf);
}
catch(std::exception const& e)
{
cout
И вот где я надеюсь, что мое понимание неполно, потому что я не удовлетворен этим. Мы теряем две вещи по сравнению с кодами ошибок: < /p>
[list]
Коды ошибок являются частью интерфейса функции. Какие коды ошибок могут быть возвращены при каких условиях обычно являются частью правильной документации, и коды ошибок из функций нижнего уровня могут быть переведены в коды ошибок из функции более высокого уровня до возврата. Между тем, ни одна библиотека никогда не документирует, какие исключения можно выбрать при каких условиях, стандартные функции библиотеки могут даже делать различные исключения в зависимости от реализации, а пропагандирование исключений означает, что разработчик обычно даже не знает точно, какие исключения, которую они пишут, или когда
[*] В моем примере. Эта запись отсутствует в поле «Somefield»
Код: Выделить всё
catch
[/list]
Есть способы обойти это. Я мог бы сделать подобные вещи в LoadConfigurationFile () :
Код: Выделить всё
try
{
// Go through first field
}
catch (...)
{
std::throw_with_nested(std::runtime_error{"Error parsing field 'SomeField'"}});
}
// Repeat with other fields
Код: Выделить всё
catch
Чего мне не хватает? Как на самом деле предназначены исключения?
Подробнее здесь: https://stackoverflow.com/questions/796 ... -used-in-c