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
enumcon solo unacaseque tenga unStringadjunto:O, a partir de Swift 4:
El uso de ejemplo sería algo como:
Si desea utilizar los
Errortipos 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
StringtuerrorMessage, si es así, ¿cómo hago eso?Stringestá 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
Stringconforme aError:Entonces puedes tirar una cuerda:
Para hacer que la cadena sea
localizedStringel error, puede extenderlaLocalizedError:fuente
localizedDescriptionsea la cadena en sí?Redundant conformance of 'String' to protocol 'Error':(error.localizedDescriptiondespué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.UserValidationErrory además de eso.rawValue. Sin embargo, si en su lugar lo implementóCustomStringConvertiblecomovar description: String { return rawValue }, podría ser útil obtener las descripciones personalizadas utilizando la sintaxis de enumeración sin tener que pasar porrawValuetodos 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.postNotificationrequiere 2-3 parámetros y su selector es similar a este. ¿AnulaNotificationy / oNotificationCenteren cada proyecto para permitirle aceptar menos parámetros de entrada?Stringpara conformarseErrores demasiado sorprendente o si unaMyErrorenumeració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