3
votes

Quel est le moyen le plus propre de lancer une erreur facultative?

Pour déballer un optionnel et le passer à une fonction que j'utilise normalement:

if let theError = optionalError { throw theError }

J'ai maintenant une erreur optionnelle que je voudrais lancer si elle n'est pas nulle:

var optionalError: Error?

optionalError.map { throw $0 }

Cela ne fonctionnera pas car la fermeture transmise à la carte ne peut pas être lancée.

Une solution alternative serait d'utiliser le complet si let code> syntaxe:

var optionalInt: Int?

optionalInt.map { someFunctionThatTakes(aNonOptional: $0) }

Mais cela utilise le nom de la variable theError deux fois et est plus sujet aux erreurs que le beau .map code > mise en œuvre.

Quelqu'un connaît-il une manière plus propre de mettre en œuvre cela?


4 commentaires

Utilisez try devant votre relevé de carte


Je vous suggère d'utiliser si let et guard let pour une manipulation facultative.


belle .map? Je pense que le déballage facultatif est bien meilleur.


Comment vous retrouvez-vous avec une erreur facultative? Cela semble un peu curieux.


3 Réponses :


4
votes

Cela ne fonctionnera pas car la fermeture transmise à la carte ne peut pas être lancée.

Ce n'est pas vrai. La fermeture transmise à

if let theError = optionalError { throw theError }

peut renvoyer une erreur. Mais cela fait que le map () s'appelle lui-même une expression de (re) lancement, donc il doit être appelé avec try:

var optionalError: Error?
// ...
try optionalError.map { throw $0 }

0 commentaires

0
votes

si vous n'utilisez pas essayez devant la méthode de la carte, cela donnera une erreur

L'appel peut être lancé mais n'est pas marqué par "essayer"

À la place, utilisez try pour générer une erreur.

optionalError.flatMap(throw $0)

Vous peut également utiliser flatMap car il évalue que l'instance facultative de fermeture n'est pas nulle

enum IntParsingError: Error {
    case overflow
    case invalidInput(String)
}

var optionalError: Error? = IntParsingError.overflow

   do {
    try optionalError.map { throw $0 }
   } catch {
     print(error)
   }

Mais encore, si let serait le meilleur moyen de gérer une erreur facultative au lieu de map et flatMap.


0 commentaires

0
votes

Vous pouvez créer une extension pour Swift.Error

try error?.throwIfNeeded()

Et l'appeler en cas d'erreur facultative

extension Swift.Error {
   func throwIfNeeded() throws {
       throw self
   }
}


0 commentaires