Как исключения предназначены для использования в C ++? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как исключения предназначены для использования в C ++? [закрыто]

Сообщение Anonymous »

Я понимаю необходимость обработки ошибок, я знаю, как использовать коды ошибок, я знаю, что исключения предназначены для улучшения кодов ошибок, но я не совсем понимаю, как это улучшение должно выглядеть на практике.

Код: Выделить всё

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");
где errcode равен 0 , если все прошло хорошо, и какое -то ненулевое значение, если произошла ошибка (например, «значение» отсутствует вход)
[*] То же самое относится и к LoadConfigurationFile () :

Код: Выделить всё

int errCode = loadConfigurationFile(&conf, "/path/to/configuration/conf.json");
[*] Реализация LoadConfigurationFile () должна проверить, что каждый вызов успешен, рассматривая код ошибки, возвращаемый каждой функцией, вызов
[*] с «значением», отсутствующий, он должен был вернуть ненулевую ошибку и сообщать о том, что полюдное «некоторое место и сообщение об ошибке, изменение глобальной переменной, изменение параметра, передаваемого функции ...) < /li>
< /ul>
Теперь, за исключением, насколько я понимаю: < /p>

Они предназначены для того, чтобы привести к меньшему количеству кода, и не может быть прочтено, так же, как и в Br /Li>
.

Код: Выделить всё

auto const value = field.getItem("value");
[*] Если возникает ошибка, getItem () бросает исключение, такое как std :: runtime_error {"intry не существует"} или, может быть В строке ошибки
[*] Исключения распространяются, поэтому вам нужно только написать код, чтобы бросить вещи внизу, где обнаруживаются ошибки, и попробуйте / блокируется вверху, где обрабатываются ошибки, и напишите все, что между ними, как если бы все вызовы были успешными: не нужно иметь дело со исключениями в LoadConfigurationFile () , только в foo () :

Код: Выделить всё

 void foo()
{
try
{
Configuration conf = loadConfigurationFile("/path/to/configuration/conf.json");
doStuff(conf);
}
catch(std::exception const& e)
{
cout 
И вот где я надеюсь, что мое понимание неполно, потому что я не удовлетворен этим. Мы теряем две вещи по сравнению с кодами ошибок: < /p>
[list]
 Коды ошибок являются частью интерфейса функции. Какие коды ошибок могут быть возвращены при каких условиях обычно являются частью правильной документации, и коды ошибок из функций нижнего уровня могут быть переведены в коды ошибок из функции более высокого уровня до возврата. Между тем, ни одна библиотека никогда не документирует, какие исключения можно выбрать при каких условиях, стандартные функции библиотеки могут даже делать различные исключения в зависимости от реализации, а пропагандирование исключений означает, что разработчик обычно даже не знает точно, какие исключения, которую они пишут, или когда
[*] В моем примере.  Эта запись отсутствует в поле «Somefield» 
). Чем дальше мы переходим от функции, которая бросила исключение из Try / block, тем сложнее знать, что за исключением
[/list]
Есть способы обойти это. Я мог бы сделать подобные вещи в LoadConfigurationFile () :

Код: Выделить всё

try
{
// Go through first field
}
catch (...)
{
std::throw_with_nested(std::runtime_error{"Error parsing field 'SomeField'"}});
}

// Repeat with other fields
Но тогда я стараюсь / блокируется практически везде, это громоздко, и, насколько я понимаю, определенно не то, как предполагаются использовать исключения.
Чего мне не хватает? Как на самом деле предназначены исключения?

Подробнее здесь: https://stackoverflow.com/questions/796 ... -used-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как исключения предназначены для использования в C ++? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Как исключения предназначены для использования в C ++? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • Visual Studio Code добавляет 5 пробелов для отступов для новых строк, несмотря на то, что все настройки предназначены дл
    Anonymous » » в форуме Python
    0 Ответы
    41 Просмотры
    Последнее сообщение Anonymous
  • ExceptionHandler не перехватывает исключения исключения
    Anonymous » » в форуме JAVA
    0 Ответы
    68 Просмотры
    Последнее сообщение Anonymous
  • Исключения C++. Плохо ли выбрасывать c-строку в качестве исключения?
    Anonymous » » в форуме C++
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»