Использование перечислений для разработки типов ошибок в Swift
Может быть, я просто полностью обдумал это, но я пытаюсь использовать перечисления для обработки ошибок из API, с которым я интегрируюсь.
Из документации по этому API я вижу все возможные ответы, которые могут быть возвращены. Я выписал это как BaseError
перечисление:
enum BaseError: Error {
case badRequest // 400
case unauthorized // 401
case forbidden // 403
case unhandledError // XXX
...
}
Теперь у моего клиента начинается моя проблема.
Моей первоначальной надеждой было взять это BaseError
перечислять и расширять / добавлять дополнительные случаи в зависимости от того, в каком клиенте я нахожусь.
Что-то вроде:
enum ClientSpecificError: BaseError {
case clientError
}
Что позволило бы мне вернуть ошибку, как ClientSpecificError.unauthorized
Теперь я знаю, что это невозможно, так как перечисления не могут наследовать другие перечисления, но мне не хватает некоторого понимания того, как мне это сделать.
Вопросы
Есть ли какой-то другой способ, которым я могу использовать enums для этого?
Это даже "лучшая практика"?
1 ответ
Вместо этого вы можете использовать связанные значения и сохранить ошибку низкого уровня в отдельном случае. Например:
enum ClientSpecificError: Error {
case clientError
case baseError(BaseError)
}
Документация Apple:
Однако иногда полезно иметь возможность хранить связанные значения других типов вместе с этими значениями случая. Это позволяет вам хранить дополнительную пользовательскую информацию вместе со значением регистра и разрешает изменять эту информацию каждый раз, когда вы используете этот регистр в своем коде.