Je veux faire quelque chose dans Swift 2 que j'ai l'habitude de faire dans plusieurs autres langues: lancer une exception d'exécution avec un message personnalisé. Par exemple (en Java):
throw new RuntimeException("A custom message here")
Je comprends que je peux lancer des types enum conformes au protocole ErrorType, mais je ne veux pas avoir à définir des énumérations pour chaque type d'erreur que je lance. Idéalement, j'aimerais pouvoir imiter au plus près l'exemple ci-dessus. J'ai cherché à créer une classe personnalisée qui implémente le protocole ErrorType, mais je ne peux même pas comprendre ce que ce protocole nécessite (voir la documentation ). Des idées?
Réponses:
L'approche la plus simple consiste probablement à définir une personnalisation
enum
avec une seulecase
qui a unString
attaché:Ou, à partir de Swift 4:
Un exemple d'utilisation serait quelque chose comme:
Si vous souhaitez utiliser des
Error
types existants , le plus général serait unNSError
, et vous pouvez créer une méthode d'usine pour en créer et en lancer un avec un message personnalisé.la source
String
intérieur de votreerrorMessage
, si oui, comment puis-je faire cela?String
est associé ici auMyError.RuntimeError
(défini au moment dethrow
), et vous y accédez aucatch
(aveclet errorMessage
).try!
, ce qui n'est pas utilisé ici. En effet, vous ne pouvez même pas faire l'appel potentiellement lanceur sans une sorte detry
. (Cette partie du code est également l'exemple d'utilisation, pas la solution réelle.)Le moyen le plus simple est de se
String
conformer àError
:Ensuite, vous pouvez simplement lancer une chaîne:
Pour que la chaîne elle-même soit celle
localizedString
de l'erreur, vous pouvez à la place étendreLocalizedError
:la source
localizedDescription
soit la chaîne elle-même?Redundant conformance of 'String' to protocol 'Error'
:(error.localizedDescription
après avoir lancé une chaîne.La solution de @ nick-keets est la plus élégante, mais elle est tombée en panne pour moi dans la cible de test avec l'erreur de compilation suivante:
Redundant conformance of 'String' to protocol 'Error'
Voici une autre approche:
Et à utiliser:
la source
Vérifiez cette version cool. L'idée est d'implémenter les protocoles String et ErrorType et d'utiliser la valeur rawValue de l'erreur.
Usage:
la source
as User.UserValidationError
et en plus de.rawValue
. Cependant, si vous implémentez à la place enCustomStringConvertible
tant quevar description: String { return rawValue }
, il peut être utile d'obtenir les descriptions personnalisées à l'aide de la syntaxe enum sans avoir à passer parrawValue
chaque endroit où vous l'imprimez.Swift 4:
Selon:
https://developer.apple.com/documentation/foundation/nserror
si vous ne souhaitez pas définir d'exception personnalisée, vous pouvez utiliser un objet NSError standard comme suit:
Impressions:
Cela vous permet de fournir une chaîne personnalisée, plus un code numérique et un dictionnaire avec toutes les données supplémentaires dont vous avez besoin, de tout type.
NB: cela a été testé sur OS = Linux (Ubuntu 16.04 LTS).
la source
Solution la plus simple sans extensions, énumérations, classes, etc. supplémentaires:
la source
raise()
au lieu dethrow
) difficile à retenir. Comparez votre solution avecthrow Foo.Bar("baz")
outhrow "foo"
multipliez par le nombre d'endroits où une exception est levée - OMI, les frais uniques d'extension ou d'énumération d'une ligne sont de loin préférables à des choses commeNSExceptionName
.postNotification
nécessite 2-3 paramètres et son sélecteur est similaire à celui-ci. Remplacez-vousNotification
et / ouNotificationCenter
dans chaque projet pour lui permettre d'accepter moins de paramètres d'entrée?String
pour se conformer àError
est trop surprenant, ou si uneMyError
énumération est trop vague (personnellement, je répondrais oui aux deux, et à la place, je ferais un cas d'énumération séparé pour chaque erreur, c'est-à-dire,throw ThisTypeOfError.thisParticularCase
).Sur la base de la réponse @Nick keets, voici un exemple plus complet:
Publié à l'origine sur mon blog swift: http://eon.codes/blog/2017/09/01/throwing-simple-errors/
la source
throw NSError(message: "err", code: 0)
domain
, nonmessage
, non?Dans le cas où vous n'avez pas besoin de détecter l'erreur et que vous souhaitez immédiatement arrêter l'application, vous pouvez utiliser une fatalError:
fatalError ("Custom message here")
la source
J'aime la réponse de @ Alexander-Borisenko, mais la description localisée n'a pas été renvoyée lorsqu'elle a été détectée comme une erreur. Il semble que vous deviez utiliser LocalizedError à la place:
Voir cette réponse pour plus de détails.
la source