R Language
Fehlertoleranter / belastbarer Code
Suche…
Parameter
Parameter | Einzelheiten |
---|---|
Ausdruck | Falls der "try-Teil" erfolgreich abgeschlossen wurde, gibt tryCatch den zuletzt ausgewerteten Ausdruck zurück . Der tatsächliche Wert, der zurückgegeben wird, falls alles gut readLines ist und keine Bedingung (dh eine Warnung oder ein Fehler ) vorliegt, ist der Rückgabewert von readLines . Beachten Sie, dass Sie nicht explizit angeben müssen, dass der Rückgabewert per return da der Code im "try-Teil" nicht innerhalb einer Funktionsumgebung umschlossen ist (im Gegensatz zu den Bedingungen für die Handler für Warnungen und Fehler). |
Warnung / Fehler / etc | Stellen Sie eine Handler-Funktion für alle Bedingungen bereit, die Sie explizit behandeln möchten. AFAIU können Sie Handler für jede Art von Bedingung bereitstellen (nicht nur Warnungen und Fehler , sondern auch benutzerdefinierte Bedingungen; siehe dazu simpleCondition und Freunde), sofern der Name der jeweiligen Handlerfunktion der Klasse der jeweiligen Bedingung entspricht (siehe Details Teil des doc für tryCatch ). |
endlich | Hier wird alles ausgeführt, was am Ende ausgeführt werden soll, unabhängig davon, ob der Ausdruck im "try-Teil" erfolgreich war oder ob eine Bedingung bestand. Wenn Sie möchten, dass mehrere Ausdrücke ausgeführt werden, müssen Sie sie in geschweiften Klammern einwickeln. Andernfalls könnten Sie finally = <expression> (dh die gleiche Logik wie für "try part"). |
Bemerkungen
tryCatch
tryCatch
gibt den Wert zurück, der der Ausführung von expr
sei denn, es gibt eine Bedingung: eine Warnung oder einen Fehler. Wenn das der Fall ist , bestimmte Rückgabewerte (zB return(NA)
oben) kann durch Zuführen einer Behandlungsfunktion für die jeweiligen Bedingungen angegeben werden (siehe Argumente warning
und error
in ?tryCatch
). Dies können Funktionen sein, die bereits vorhanden sind, aber Sie können sie auch in tryCatch
definieren (wie oben beschrieben).
Auswirkungen der Auswahl bestimmter Rückgabewerte der Handlerfunktionen
Da wir angegeben haben, dass NA
im Falle eines Fehlers im "try-Teil" zurückgegeben werden soll, ist das dritte Element in y
NA
. Wenn wir NULL
als Rückgabewert gewählt hätten, wäre die Länge von y
nur 2
statt 3
da lapply
die NULL
Rückgabewerte einfach "ignorieren / lapply
wird. Beachten Sie auch, dass, wenn Sie keinen expliziten Rückgabewert über return
angeben, die Handlerfunktionen NULL
(dh im Falle eines Fehlers oder einer Warnbedingung ).
Warnmeldung "Unerwünscht"
Wenn das dritte Element unserer urls
Vektor unsere Funktion trifft, erhalten wir die folgende Warnung zusätzlich zu der Tatsache , dass ein Fehler (tritt readLines
klagt zuerst , dass sie die Verbindung über eine Warnung , bevor sie tatsächlich Fehler mit einem Fehler öffnen können):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Ein Fehler "gewinnt" über eine Warnung , daher sind wir in diesem Fall nicht wirklich an der Warnung interessiert. Wir haben also in readLines
warn = FALSE
readLines
, aber das scheint keine Wirkung zu haben. Eine alternative Möglichkeit, die Warnung zu unterdrücken, ist die Verwendung
suppressWarnings(readLines(con = url))
anstatt
readLines(con = url, warn = FALSE)
TryCatch () verwenden
Wir definieren eine robuste Version einer Funktion, die den HTML-Code von einer bestimmten URL liest. Robust in dem Sinne, dass wir mit Situationen umgehen wollen, in denen etwas schief geht (Fehler) oder nicht ganz so wie wir es geplant haben (Warnung). Der Oberbegriff für Fehler und Warnungen ist Bedingung
Funktionsdefinition mit 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)
}
Dinge testen
Definieren wir einen Vektor von URLs, bei dem ein Element keine gültige URL ist
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"
)
Und übergeben Sie dies als Eingabe an die oben definierte Funktion
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
Untersuchung der Ausgabe
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