Как обработать исключение «вне диапазона» в C ++ при реализации nd-массива - PullRequest
0 голосов
/ 01 апреля 2019

Я пытался реализовать nd-массив в C ++, как numpy в python, но я не знаю, как справляться с такими проблемами (или исключениями?), Как «индексы вне диапазона». Должен ли я просто использовать assert для проверки параметров в начале функций или использовать механизмы try / catch / throw?

Кстати, если я использую assert, как печатать сообщения об ошибках типа «входной индекс находится вне диапазона» для пользователей, а не просто «утверждение в строке 5 не удалось».

макрос, который я сейчас использую для проверки индекса:

#define RANGE_CHECK(total, index) assert(total > index)

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Метод, используемый стандартной библиотекой, состоит в том, чтобы выдавать std::out_of_range из функций с именами at и иметь неопределенное поведение в функциях с именами [].

0 голосов
/ 01 апреля 2019

C ++ - это мир ленивых программистов;они обычно стараются избегать обработки исключений как можно дольше.Как упоминалось ранее @Caleth, следуя стандартным соглашениям, можно предоставить не-бросающий operator[], а также бросающий at.Но бустеры предложили отложить подход к обработке исключений во всех следующих случаях:

  1. std :: необязательный: вернуть std::optional<T> вместо T:

    std::optional<T*> arr::at(size_t)noexcept;

  2. Обеспечить перегрузку без выброса - наряду с функцией выброса - с дополнительным std::error_condition ссылочным аргументом:

    `T * arr :: at (size_t)) throw (std :: out_of_range);

    T * arr :: at (size_t, std :: error_condition & ec) noexcept; `

  3. вернуть пару значенийи std :: error_condition: std::pair<T*,std::error_condition> arr::at(size_t)noexcept;

0 голосов
/ 01 апреля 2019

Утверждения относятся к вещам, которые никогда не должны происходить, и единственный способ справиться с ними - завершить программу. По сути, вы никогда не хотите их использовать (хотя иногда это единственный способ).

Так что иди с исключениями. В библиотеке std уже определено несколько исключений, которые вы можете выбросить для таких вещей, как индекс вне диапазона. Используйте их.

За исключением, по умолчанию будет прекращение работы программы, как и в случае с assert. Но в отличие от assert программа может попытаться / поймать исключение и обработать ошибку, если они захотят. Тогда они должны напечатать более значимое сообщение об ошибке, если они того пожелают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...