2017-06-05 4 views
0

Je suis en train de construire une petite bibliothèque pour lire/écrire/déplacer des fichiers simultanément. Tout en faisant cela je suis tombé sur le problème de la gestion des erreurs qui me conduisent à penser:Comment lancer des erreurs dans une lib

dois-je jeter une erreur dans la lib et ont toute plantage de l'application de l'utilisateur, ou retourner un message d'erreur pour l'utilisateur de gérer?

Je voudrais savoir quel est le meilleur pour la situation donnée et pourquoi.

+0

Comme tout "ça dépend." Si vous le lancez vous-même, cela devrait être une exception qui peut être détectée, pas une erreur. Dans tous les cas, le comportement doit être documenté. L'exception capturable par rapport à l'erreur renvoyée dépend du langage, des autres bibliothèques et de l'audience. –

+0

J'ai ajouté la langue que j'utilise comme une balise, mais comme Golang est fanatique de 'if err! = Nil' je pensais peut-être juste renvoyer un' error.New() '? – duck

+0

Vous ne paniquez jamais dans les bibliothèques. – zerkms

Répondre

1

Je recommande de lire sur l'article The Go Blog Error Handling and Go et Effective Go sur les erreurs, qui jettent un coup d'oeil à la puissance du type d'erreur de Go.

En général, les paniques peuvent être utilisées dans une bibliothèque/un paquet, mais elles ne doivent pas se propager à l'extérieur du paquet à moins d'une erreur fatale. En d'autres termes, les développeurs ne devraient jamais avoir à écrire du code qui attend des paniques de votre bibliothèque.

Vous pouvez utiliser des paniques internes si la gestion de la propagation des erreurs est fastidieuse. Dans ce cas, vous pouvez envelopper vos fonctions publiques avec un defer/récupérer gestionnaire qui passe l'erreur

func Function() (err error) { 
    defer func() { 
     if r := recover(); r != nil { 
      err = r.(error) 
     } 
    }() 
    // Do stuff 
    panic(errors.New("Error Message")) 
} 

Cet échantillon est adapté à partir du package json de la bibliothèque standard, où les paniques internes sont utilisés pour nettoyer erreur imbriquée complexe manipulation.