trucos mensajes los invisibles expresivos enviar efectos con como activar ios swift swift2

ios - mensajes - ¿La forma más sencilla de lanzar un error/excepción con un mensaje personalizado en Swift 2?



mensajes con efectos iphone (9)

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 ajustan 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 documentation ). Ideas?


Basado en la respuesta de @Nick keets, aquí hay un ejemplo más completo:

extension String: Error {}/*Enables you to throw a string*/ extension String: LocalizedError {/*Adds error.localizedDescription to Error instances*/ public var errorDescription: String? { return self } } func test(color:NSColor) throws{ if color == .red { throw "I don''t like red" }else if color == .green { throw "I''m not into green" }else { throw "I like all other colors" } } do { try test(color:.green) } catch let error where error.localizedDescription == "I don''t like red"{ Swift.print ("Error: /(error)")//"I don''t like red" }catch let error { Swift.print ("Other cases: Error: /(error.localizedDescription)")/*I like all other colors*/ }

Publicado originalmente en mi rápido blog: http://eon.codes/blog/2017/09/01/throwing-simple-errors/


El enfoque más simple es probablemente definir una enum personalizada con solo un case que tenga una String adjunta:

enum MyError: ErrorType { case runtimeError(String) }

O, a partir de Swift 4:

enum MyError: Error { case runtimeError(String) }

El uso de ejemplo sería algo como:

func someFunction() throws { throw MyError.runtimeError("some message") } do { try someFunction() } catch MyError.runtimeError(let errorMessage) { print(errorMessage) }

Si desea utilizar los tipos de Error existentes, el más general sería un NSError , y podría crear un método de fábrica para crear y lanzar uno con un mensaje personalizado.


La forma más simple es hacer que String ajuste al Error :

extension String: Error {}

Entonces puedes tirar una cuerda:

throw "Some Error"

Para hacer que la cadena sea la cadena localizedString del error, puede extender LocalizedError :

extension String: LocalizedError { public var errorDescription: String? { return self } }


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:

struct RuntimeError: Error { let message: String init(_ message: String) { self.message = message } public var localizedDescription: String { return message } }

Y para usar:

throw RuntimeError("Error message.")


La solución más simple sin extensiones adicionales, enumeraciones, clases, etc.

NSException(name:NSExceptionName(rawValue: "name"), reason:"reason", userInfo:nil).raise()


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:

struct RuntimeError: LocalizedError { let message: String init(_ message: String) { self.message = message } public var errorDescription: String? { return message } }

Vea esta respuesta para más detalles.


Mira esta genial versión. La idea es implementar los protocolos String y ErrorType y usar el rawValue del error.

enum UserValidationError: String, Error { case noFirstNameProvided = "Please insert your first name." case noLastNameProvided = "Please insert your last name." case noAgeProvided = "Please insert your age." case noEmailProvided = "Please insert your email." }

Uso:

do { try User.define(firstName, lastName: lastName, age: age, email: email, gender: gender, location: location, phone: phone) } catch let error as User.UserValidationError { print(error.rawValue) return }


Simplemente use un fatalError: fatalError ("Custom message here")


Swift 4:

Según:

https://developer.apple.com/documentation/foundation/nserror

Si no desea definir una excepción personalizada, puede usar un objeto NSError estándar de la siguiente manera:

import Foundation do { throw NSError(domain: "my error description", code: 42, userInfo: ["ui1":12, "ui2":"val2"] ) } catch let error as NSError { print("Caught NSError: /(error.localizedDescription), /(error.domain), /(error.code)") let uis = error.userInfo print("/tUser info:") for (key,value) in uis { print("/t/tkey=/(key), value=/(value)") } }

Huellas dactilares:

Caught NSError: The operation could not be completed, my error description, 42 User info: key=ui1, value=12 key=ui2, value=val2

Esto le permite proporcionar una cadena personalizada, además de 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).