Quiero hacer algo en Swift 2 que estoy acostumbrado a hacer en varios otros idiomas: lanzar una excepción de tiempo de ejecución con un mensaje personalizado. Por ejemplo (en Java):
throw new RuntimeException("A custom message here")
Entiendo que puedo lanzar tipos de enumeración que se ajusten al protocolo ErrorType, pero no quiero tener que definir enumeraciones para cada tipo de error que arroje. Idealmente, me gustaría poder imitar el ejemplo anterior lo más fielmente posible. Busqué crear una clase personalizada que implemente el protocolo ErrorType, pero ni siquiera puedo darme cuenta de lo que ese protocolo requiere (ver documentación ). Ideas?
Respuestas:
El enfoque más simple es probablemente definir una costumbre
enum
con solo unacase
que tenga unString
adjunto:O, a partir de Swift 4:
El uso de ejemplo sería algo como:
Si desea utilizar los
Error
tipos existentes , el más general sería unNSError
, y podría hacer un método de fábrica para crear y lanzar uno con un mensaje personalizado.fuente
String
tuerrorMessage
, si es así, ¿cómo hago eso?String
está asociado aquí con elMyError.RuntimeError
(establecido en el momento dethrow
), y usted obtiene acceso a él en elcatch
(conlet errorMessage
).try!
, que no se usa aquí. De hecho, ni siquiera puede hacer la llamada potencialmente lanzada sin algún tipo detry
. (También esa parte del código es el uso de ejemplo, no la solución real.)La forma más simple es hacer que se
String
conforme aError
:Entonces puedes tirar una cuerda:
Para hacer que la cadena sea
localizedString
el error, puede extenderlaLocalizedError
:fuente
localizedDescription
sea la cadena en sí?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
después de lanzar una cadena.La solución de @ nick-keets es muy elegante, pero se desglosó en el objetivo de prueba con el siguiente error de tiempo de compilación:
Redundant conformance of 'String' to protocol 'Error'
Aquí hay otro enfoque:
Y para usar:
fuente
Mira esta genial versión. La idea es implementar los protocolos String y ErrorType y usar el rawValue del error.
Uso:
fuente
as User.UserValidationError
y además de eso.rawValue
. Sin embargo, si en su lugar lo implementóCustomStringConvertible
comovar description: String { return rawValue }
, podría ser útil obtener las descripciones personalizadas utilizando la sintaxis de enumeración sin tener que pasar porrawValue
todos los lugares donde lo imprime.Swift 4:
Según:
https://developer.apple.com/documentation/foundation/nserror
Si no desea definir una excepción personalizada, puede utilizar un objeto NSError estándar de la siguiente manera:
Huellas dactilares:
Esto le permite proporcionar una cadena personalizada, más un código numérico y un diccionario con todos los datos adicionales que necesita, de cualquier tipo.
NB: esto fue probado en OS = Linux (Ubuntu 16.04 LTS).
fuente
La solución más simple sin extensiones adicionales, enumeraciones, clases, etc.
fuente
raise()
lugar dethrow
) que es difícil de recordar. Compare su soluciónthrow Foo.Bar("baz")
othrow "foo"
multiplíquela por el número de lugares donde se produce una excepción: en mi opinión, la tarifa única de extensión o enumeración de una línea es mucho mejor que cosas como estaNSExceptionName
.postNotification
requiere 2-3 parámetros y su selector es similar a este. ¿AnulaNotification
y / oNotificationCenter
en cada proyecto para permitirle aceptar menos parámetros de entrada?String
para conformarseError
es demasiado sorprendente o si unaMyError
enumeración es demasiado vaga (personalmente respondería sí a ambas, y en su lugar haría un caso de enumeración separado para cada error, es decir,throw ThisTypeOfError.thisParticularCase
)Basado en la respuesta de @Nick keets, aquí hay un ejemplo más completo:
Publicado originalmente en mi rápido blog: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
fuente
throw NSError(message: "err", code: 0)
domain
, nomessage
, ¿verdad?En caso de que no necesite detectar el error y desee detener inmediatamente la aplicación, puede usar un error fatal:
fatalError ("Custom message here")
fuente
Me gusta la respuesta de @ Alexander-Borisenko, pero la descripción localizada no fue devuelta cuando se detectó como un Error. Parece que necesita usar LocalizedError en su lugar:
Vea esta respuesta para más detalles.
fuente