R Language
Fouttolerante / veerkrachtige code
Zoeken…
parameters
Parameter | Details |
---|---|
expr | In het geval dat het "try-gedeelte" is voltooid, retourneert tryCatch de laatst geëvalueerde uitdrukking . De werkelijke waarde die wordt geretourneerd in het geval dat alles goed is gegaan en er geen voorwaarde (dwz een waarschuwing of een fout ) is, is de retourwaarde van readLines . Merk op dat u de retourwaarde via return niet expliciet hoeft te vermelden omdat de code in het "try-gedeelte" niet is ingepakt binnen een functieomgeving (in tegenstelling tot die voor de condition handlers voor waarschuwingen en fouten hieronder) |
warning / error / etc | Geef / definieer een handlerfunctie voor alle voorwaarden die u expliciet wilt behandelen. AFAIU, u kunt handlers bieden voor elk type voorwaarden (niet alleen waarschuwingen en fouten , maar ook aangepaste voorwaarden; zie hiervoor simpleCondition en vrienden) zolang de naam van de respectieve handlerfunctie overeenkomt met de klasse van de respectieve voorwaarde (zie de Details deel van het document voor tryCatch ). |
Tenslotte | Hier gaat alles wat aan het einde moet worden uitgevoerd, ongeacht of de uitdrukking in het "try-gedeelte" is geslaagd of als er een voorwaarde was. Als u meer dan één uitdrukking wilt uitvoeren, moet u ze tussen accolades plaatsen, anders had u gewoon finally = <expression> (dwz dezelfde logica als voor "try part"). |
Opmerkingen
tryCatch
tryCatch
retourneert de waarde die is gekoppeld aan het uitvoeren van expr
tenzij er een voorwaarde is: een waarschuwing of een fout. Als dat het geval is, kunnen specifieke retourwaarden (bijvoorbeeld return(NA)
hierboven) worden opgegeven door een handlerfunctie op te geven voor de respectieve voorwaarden (zie argumenten warning
en error
in ?tryCatch
). Dit kunnen functies zijn die al bestaan, maar u kunt ze ook definiëren in tryCatch
(zoals we hierboven deden).
Implicaties van het kiezen van specifieke retourwaarden van de handlerfuncties
Zoals we hebben gespecificeerd dat NA
moet worden geretourneerd in geval van een fout in het "try-gedeelte", is het derde element in y
NA
. Als we zouden hebben gekozen NULL
om de terugkeer waarde, de lengte van y
zou gewoon zijn geweest 2
in plaats van 3
als lapply
gewoon "negeren / drop" return waarden die NULL
. Merk ook op dat als u geen expliciete retourwaarde opgeeft via return
, de handlerfuncties NULL
retourneren (dwz in het geval van een fout of een waarschuwingsconditie ).
Waarschuwingsbericht "Ongewenst"
Wanneer het derde element van onze urls
onze functie raakt, krijgen we de volgende waarschuwing naast het feit dat er een fout optreedt ( readLines
klaagt eerst dat het de verbinding niet kan openen via een waarschuwing voordat het daadwerkelijk mislukt met een fout ):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Een fout "wint" van een waarschuwing , dus we zijn niet echt geïnteresseerd in de waarschuwing in dit specifieke geval. Daarom hebben we readLines
warn = FALSE
in readLines
, maar dat lijkt geen effect te hebben. Een alternatieve manier om de waarschuwing te onderdrukken is om te gebruiken
suppressWarnings(readLines(con = url))
in plaats van
readLines(con = url, warn = FALSE)
TryCatch () gebruiken
We definiëren een robuuste versie van een functie die de HTML-code van een bepaalde URL leest. Robuust in de zin dat we willen dat het situaties aanpakt waarin iets fout gaat (fout) of niet helemaal zoals we het hadden gepland (waarschuwing). De overkoepelende term voor fouten en waarschuwingen is voorwaarde
Functiedefinitie met 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)
}
Dingen testen
Laten we een vector van URL's definiëren waarbij één element geen geldige URL is
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"
)
En geef dit door als invoer voor de functie die we hierboven hebben gedefinieerd
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
Onderzoek van de output
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