Question

Afin de mettre en place une interface cohérente de gestion des exceptions pour mes collègues et mes scripts R, j'aimerais utiliser la structure tryCatch suivante.

  1. Un tryCatch externe est enroulé autour d'un script R donné.Il est utilisé pour détecter et gérer les erreurs fatales qui nécessitent l’abandon du script.
  2. Commandes tryCatch spécifiques à l'utilisateur dans les scripts de l'utilisateur.Ceux-ci devraient attraper et, éventuellement, gérer
    • 2a.erreurs non fatales, où aucun avortement de script n'est nécessaire
    • 2b.erreurs fatales qui nécessitent l'abandon du script.L'erreur est gérée par le tryCatch externe [voir 1.]
    • 2c.erreurs fatales avec des informations d’erreur supplémentaires.Erreur gérée par tryCatch externe.

Le code suivant explique comment implémenter ces fonctionnalités.Cependant, comme je ne suis pas un expert en R, je voudrais demander si c'est une bonne approche.Spécifiquement:

T1.Est-il acceptable de ne pas spécifier de gestionnaire d'erreurs dans le tryCatch interne et d'attendre que le tryCatch externe gère cette erreur (voir 2b.ci-dessus et le code ci-dessous) ?

Q2.Renvoie la même erreur (voir 2c.ci-dessus/ci-dessous) dans un gestionnaire correct/considéré comme un bon style de codage ?

Merci!

#outer tryCatch, see 1.
tryCatch({
  #user code block
  #2a. user specific tryCatch, object "vec" not defined
  tryCatch(print(vec),error=function(e) {print("Non-fatal error. Script execution continued.");print(e);})

  #2b. user specific tryCatch
  tryCatch(vec*2)

  #2c. user specific tryCatch
  tryCatch(vec*parameter1, error=function(e) {print("Additional fatal error information. Script execution aborted.");stop(e);})
  #end of user code block
},
     #outer tryCatch error handler in order to handle fatal errors
     error=function(e) {print("Fatal error");print(e);} 
    )
Était-ce utile?

La solution

C'est parfaitement bien de détecter seulement quelques erreurs, en laissant d'autres au gestionnaire externe ou à aucun gestionnaire du tout.Le système d'erreur est un peu plus flexible que celui généralement utilisé, donc pour renvoyer une erreur, vous pourriez penser à créer votre propre type d'erreur.

ourError <-
    function(original, message, class="ourError")
{
    msg <- paste(message, conditionMessage(original), sep="\n  ")
    structure(list(message = msg, call = conditionCall(original)),
              class = c(class, class(original)))
}

et lancer et/ou manipuler cela

tryCatch(vec*parameter1, error=function(e) {
    err <- ourError(e, "addition fatal info; script aborted")
    stop(err)
})

L'un des avantages de ceci est que des comportements supplémentaires peuvent être spécifiés dans le gestionnaire de niveau supérieur, en utilisant la classe renvoyée par ourError()

tryCatch({
    tryCatch(stop("oops"), error=function(e) {
        err <- ourError(e, "addition fatal info; script aborted",
                      c("fatal", "ourError"))
        stop(err)
    })
}, ourError=function(err) {
    message("We caught but didn't handle this:\n", err)
}, error =function(err) {
    message("This one got away: ", err)
})
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top