Я разрабатываю коммуникационную библиотеку С++. Библиотека предоставит унифицированный интерфейс для взаимодействия с различными ключами для выполнения удаленного кода, такими как SenseLock, KEYLOK, Guardant Code.
Ключи основаны на технологии смарт-карт и имеют внутреннюю файловую систему и оперативную память.
Типичная процедура работы включает (1) перечисление ключей, подключенных к USB-портам, (2) соединение с выбранным ключом, (3) выполнение именованного модуля, передающего входные данные и сбор выходных данных.
Ну, тривиально, что все эти этапы могут закончиться ошибкой. Могут быть много случаев, но наиболее общие:
- Ключ не найден (обязательно в фатальном случае).
- Ошибка соединения с ключом (фатальный случай).
- Указанный модуль выполнения не найден внутри ключа (?).
- Запрошенная операция не удалась из-за таймаута (?).
- Требуемая операция требует авторизации (предположительно восстанавливаемый случай).
- Произошла ошибка памяти при выполнении модуля в ключе (обязательно в фатальном случае).
- Произошла ошибка файловой системы в ключах (обязательно в фатальном случае).
? - Я еще не знаю, если дело считается фатальным или нет.
Я все еще решаю, нужно ли бросать исключения, возвращать коды ошибок или реализовывать методы для обоих случаев.
Вопросы:
- Исключения заменяют коды ошибок полностью или, возможно, мне нужно использовать их только для "фатальных случаев"?
- Является ли смешивание двух парадигм (исключений и кодов ошибок) хорошей идеей?
- Это хорошая идея предоставить пользователю две концепции?
- Есть ли хорошие примеры концепций смешивания исключений и ошибок?
- Как бы вы это реализовали?
Обновление 1.
Было бы интересно увидеть больше мнений с разных точек зрения, поэтому я решил добавить 100 голосов в вопрос.