Я хочу сделать что-то в Swift 2, что я привык делать на нескольких других языках: генерировать исключение времени выполнения с пользовательским сообщением. Например (на Java):
throw new RuntimeException("A custom message here")
Я понимаю, что могу генерировать перечислимые типы, которые соответствуют протоколу ErrorType, но я не хочу определять перечисления для каждого типа ошибки, которую я генерирую. В идеале я хотел бы иметь возможность подражать приведенному выше примеру как можно ближе. Я посмотрел на создание собственного класса, который реализует протокол ErrorType, но я даже не могу понять, чего требует этот протокол (см. Документацию ). Идеи?
Ответы:
Самый простой подход, вероятно, состоит в том, чтобы определить один пользовательский элемент, к которому прикреплен
enum
только один :case
String
Или, как в Swift 4:
Пример использования будет что-то вроде:
Если вы хотите использовать существующие
Error
типы, самый общий из них будет anNSError
, и вы можете создать фабричный метод, чтобы создать и выдать его с пользовательским сообщением.источник
String
внутреннюю часть вашегоerrorMessage
, если да, то как мне это сделать?String
ассоциируется сMyError.RuntimeError
(установлено во времяthrow
), и вы получаете доступ к нему вcatch
(сlet errorMessage
).try!
, что здесь не используется. Вы действительно не можете даже сделать потенциально бросающий вызов без какого-либо родаtry
. (Также эта часть кода является примером использования, а не фактическим решением.)Самый простой способ - это
String
соответствоватьError
:Тогда вы можете просто бросить строку:
Чтобы сделать строку самой
localizedString
ошибкой, вы можете вместо этого расширитьLocalizedError
:источник
localizedDescription
быть самой строкой?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
после броска строки.Решение @ nick-keets является наиболее элегантным, но оно сломалось для меня в тестовой цели со следующей ошибкой времени компиляции:
Redundant conformance of 'String' to protocol 'Error'
Вот еще один подход:
И использовать:
источник
Проверьте эту классную версию. Идея состоит в том, чтобы реализовать оба протокола String и ErrorType и использовать rawValue ошибки.
Использование:
источник
as User.UserValidationError
и.rawValue
. Однако, если вы вместо этого реализовалиCustomStringConvertible
какvar description: String { return rawValue }
, было бы полезно получить пользовательские описания с использованием синтаксиса enum без необходимости проходить черезrawValue
все места, где вы его печатаете.Свифт 4:
Согласно:
https://developer.apple.com/documentation/foundation/nserror
если вы не хотите определять пользовательское исключение, вы можете использовать стандартный объект NSError следующим образом:
Печать:
Это позволяет вам предоставить пользовательскую строку, а также числовой код и словарь со всеми необходимыми дополнительными данными любого типа.
Примечание: это было протестировано на OS = Linux (Ubuntu 16.04 LTS).
источник
Самое простое решение без дополнительных расширений, перечислений, классов и т. Д .:
источник
raise()
вместоthrow
) заклинанием, которое трудно запомнить. Сравните ваше решение сthrow Foo.Bar("baz")
илиthrow "foo"
умножьте на количество мест, где выдается исключение - IMO единовременная плата за однострочное расширение или enum гораздо предпочтительнее, чем подобные вещиNSExceptionName
.postNotification
требуется 2-3 параметра и его селектор похож на этот. Вы переопределяетеNotification
и / илиNotificationCenter
в каждом проекте, чтобы позволить ему принимать меньше входных параметров?String
соответствияError
, или еслиMyError
перечисление слишком расплывчато (лично я отвечал бы да обоим, и вместо этого делал бы отдельный случай перечисления для каждой ошибки, т. Е.throw ThisTypeOfError.thisParticularCase
).Основываясь на ответе @Nick keets, вот более полный пример:
Первоначально опубликовано в моем быстром блоге: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
источник
throw NSError(message: "err", code: 0)
domain
, не такmessage
ли?Если вам не нужно отлавливать ошибку и вы хотите немедленно остановить приложение, вы можете использовать fatalError:
fatalError ("Custom message here")
источник
Мне нравится ответ @ Alexander-Borisenko, но локализованное описание не было возвращено при обнаружении ошибки. Кажется, что вам нужно использовать LocalizedError вместо:
Смотрите этот ответ для более подробной информации.
источник