Самый упрощенный совет:
Если вы не знаете, ловит ли исключение или нет, не перехватываете его и не позволяете ему течь, кто-то в одной точке.
Дело в том, что исключения являются исключительными (подумайте std::bad_alloc
).Помимо некоторых странных применений для «быстрого выхода» глубоко вложенных блоков кода (что мне не очень нравится), исключения следует использовать только тогда, когда вы замечаете что-то, с чем не знаете, как иметь дело.
Давайте выберем примеры:
file = open('littlefile.txt', open.mode.Read)
Мне кажется очевидным, что это может не сработать, и в ряде случаев.Хотя сообщение о причине сбоя важно (для точной диагностики), я считаю, что создание исключения здесь НЕ является хорошей практикой.
В C ++ я написал бы такую функцию как:
boost::variant<FileHandle,Error> open(std::string const& name, mode_t mode);
Функция может возвращать дескриптор файла (отлично) или ошибку (upps).Но так как это ожидается, лучше разобраться с этим сейчас.Кроме того, он обладает явным преимуществом, заключающимся в том, что он является явным: просмотр подписи означает, что вы знаете, чего ожидать (не говоря о спецификациях исключений, это неработоспособная функция).
В целом я склонен считать эти функцииfind
функций.Когда вы ищете что-то, ожидается, что поиск может закончиться неудачей, здесь нет ничего исключительного.
Подумайте об общем случае ассоциативного контейнера:
template <typename Key, typename Value>
boost::optional<Value const&> Associative::GetItem(Key const& key) const;
Еще раз спасибоЧтобы повысить, я даю понять, что мой метод может (или нет) вернуть ожидаемое значение.Нет необходимости создавать исключение ElementNotFound
.
Для еще одного примера: ожидается, что проверка ввода пользователя завершится неудачно.В целом, ожидается, что исходные данные будут враждебными / плохо сформированными / неправильными.Здесь не нужно исключений.
С другой стороны, предположим, что мое программное обеспечение работает с базой данных и не может работать без нее.Если уровень абстракции базы данных теряет соединение с базой данных и не может установить новую, имеет смысл создать исключение.
Я оставляю исключения для технических проблем (потеря соединения, нехватка памяти,и т.д ...).