R Language
Code tolérant aux pannes / résilient
Recherche…
Paramètres
Paramètre | Détails |
---|---|
expr | Au cas où la "partie d'essai" serait terminée, tryCatch renverrait la dernière expression évaluée . Par conséquent, la valeur réelle renvoyée au cas où tout irait bien et qu’il n’ya pas de condition (c’est-à-dire un avertissement ou une erreur ) est la valeur de retour de readLines . Notez que vous n'avez pas besoin d'expliquer clairement la valeur de retour via return car le code de la partie "try" n'est pas encapsulé dans un environnement de fonction (contrairement aux gestionnaires de conditions pour les avertissements et les erreurs ci-dessous) |
avertissement / erreur / etc | Fournissez / définissez une fonction de gestionnaire pour toutes les conditions que vous souhaitez gérer explicitement. AFAIU, vous pouvez fournir des gestionnaires pour tout type de conditions (pas seulement des avertissements et des erreurs , mais aussi des conditions personnalisées ; voir simpleCondition et friends pour cela) tant que le nom de la fonction de gestionnaire correspondante correspond à la classe de la condition respective (voir le Détails partie de la doc pour tryCatch ). |
enfin | Ici va tout ce qui devrait être exécuté à la toute fin, peu importe si l'expression dans la partie "try" a réussi ou s'il y avait une condition. Si vous voulez que plusieurs expressions soient exécutées, alors vous devez les mettre entre accolades, sinon vous pourriez simplement écrire finally = <expression> (c'est-à-dire la même logique que pour "try part"). |
Remarques
tryCatch
tryCatch
renvoie la valeur associée à l'exécution de expr
sauf s'il y a une condition: un avertissement ou une erreur. Si tel est le cas, des valeurs de retour spécifiques (par exemple, return(NA)
ci-dessus) peuvent être spécifiées en fournissant une fonction de gestionnaire pour les conditions respectives (voir arguments warning
et error
in ?tryCatch
). Celles-ci peuvent être des fonctions qui existent déjà, mais vous pouvez également les définir dans tryCatch
(comme nous l'avons fait ci-dessus).
Implications du choix de valeurs de retour spécifiques pour les fonctions du gestionnaire
Comme nous avons spécifié que NA
doit être renvoyé en cas d'erreur dans la partie "try", le troisième élément de y
est NA
. Si nous avions choisi NULL
pour être la valeur de retour, la longueur de y
aurait simplement été 2
au lieu de 3
car lapply
ne lapply
que "ignorer / supprimer" les valeurs de retour NULL
. Notez également que si vous ne spécifiez pas une valeur de retour explicite via return
, les fonctions du gestionnaire NULL
(c'est-à-dire en cas d' erreur ou de condition d' avertissement ).
Message d'avertissement "indésirable"
Lorsque le troisième élément de notre vecteur d' urls
frappe notre fonction, nous obtenons l'avertissement suivant en plus du fait qu'une erreur se produit ( readLines
plaint d'abord de ne pas pouvoir ouvrir la connexion via un avertissement avant de readLines
une erreur ):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Une erreur "gagne" sur un avertissement , nous ne sommes donc pas vraiment intéressés par l'avertissement dans ce cas particulier. Ainsi, nous avons défini warn = FALSE
dans readLines
, mais cela ne semble pas avoir d'effet. Une autre façon de supprimer l'avertissement est d'utiliser
suppressWarnings(readLines(con = url))
au lieu de
readLines(con = url, warn = FALSE)
Utiliser tryCatch ()
Nous définissons une version robuste d'une fonction qui lit le code HTML à partir d'une URL donnée. Robuste en ce sens que nous voulons qu’il gère des situations où quelque chose ne va pas (erreur) ou pas exactement comme prévu (avertissement). Le terme générique pour les erreurs et les avertissements est la condition
Définition de la fonction à l'aide de tryCatch
readUrl <- function(url) {
out <- tryCatch(
########################################################
# Try part: define the expression(s) you want to "try" #
########################################################
{
# Just to highlight:
# If you want to use more than one R expression in the "try part"
# then you'll have to use curly brackets.
# Otherwise, just write the single expression you want to try and
message("This is the 'try' part")
readLines(con = url, warn = FALSE)
},
########################################################################
# Condition handler part: define how you want conditions to be handled #
########################################################################
# Handler when a warning occurs:
warning = function(cond) {
message(paste("Reading the URL caused a warning:", url))
message("Here's the original warning message:")
message(cond)
# Choose a return value when such a type of condition occurs
return(NULL)
},
# Handler when an error occurs:
error = function(cond) {
message(paste("This seems to be an invalid URL:", url))
message("Here's the original error message:")
message(cond)
# Choose a return value when such a type of condition occurs
return(NA)
},
###############################################
# Final part: define what should happen AFTER #
# everything has been tried and/or handled #
###############################################
finally = {
message(paste("Processed URL:", url))
message("Some message at the end\n")
}
)
return(out)
}
Tester les choses
Définissons un vecteur d'URL où un élément n'est pas une URL valide
urls <- c(
"http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html",
"http://en.wikipedia.org/wiki/Xz",
"I'm no URL"
)
Et transmettez ceci comme entrée à la fonction que nous avons définie ci-dessus
y <- lapply(urls, readUrl)
# Processed URL: http://stat.ethz.ch/R-manual/R-devel/library/base/html/connections.html
# Some message at the end
#
# Processed URL: http://en.wikipedia.org/wiki/Xz
# Some message at the end
#
# URL does not seem to exist: I'm no URL
# Here's the original error message:
# cannot open the connection
# Processed URL: I'm no URL
# Some message at the end
#
# Warning message:
# In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Recherche de la sortie
length(y)
# [1] 3
head(y[[1]])
# [1] "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"
# [2] "<html><head><title>R: Functions to Manipulate Connections</title>"
# [3] "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">"
# [4] "<link rel=\"stylesheet\" type=\"text/css\" href=\"R.css\">"
# [5] "</head><body>"
# [6] ""
y[[3]]
# [1] NA