R Language
Kod odporny na uszkodzenia / sprężysty
Szukaj…
Parametry
Parametr | Detale |
---|---|
expr | W przypadku pomyślnego ukończenia „części tryCatch zwróci ostatnio ocenione wyrażenie . Stąd faktyczna wartość zwracana na wypadek, gdyby wszystko poszło dobrze i nie ma żadnego warunku (tj. Ostrzeżenie lub błąd ) jest wartością readLines . Zauważ, że nie musisz wyjaśniać wartości zwracanej przez return ponieważ kod w „części próbnej” nie jest zawinięty wewnątrz środowiska funkcji (inaczej niż w przypadku procedur obsługi warunków dla ostrzeżeń i błędów poniżej) |
ostrzeżenie / błąd / itp | Podaj / zdefiniuj funkcję modułu obsługi dla wszystkich warunków, które chcesz jawnie obsłużyć. AFAIU, możesz dostarczyć moduły obsługi dla dowolnego typu warunków (nie tylko ostrzeżenia i błędy , ale także warunki niestandardowe ; zobacz simpleCondition i przyjaciele, jeśli to możliwe), o ile nazwa odpowiedniej funkcji modułu obsługi pasuje do klasy odpowiedniego warunku (patrz Szczegółowa część dokumentu tryCatch ). |
Wreszcie | Oto wszystko, co należy wykonać na samym końcu, niezależnie od tego, czy wyrażenie w części „try part” się powiodło, czy też wystąpił jakiś warunek. Jeśli chcesz wykonać więcej niż jedno wyrażenie, musisz zawinąć je w nawiasy klamrowe, w przeciwnym razie możesz po prostu napisać w finally = <expression> (tzn. Taką samą logikę jak dla „wypróbuj część”). |
Uwagi
tryCatch
tryCatch
zwraca wartość związaną z wykonaniem expr
chyba że występuje warunek: ostrzeżenie lub błąd. W takim przypadku określone wartości zwracane (np. return(NA)
powyżej) można określić, podając funkcję modułu obsługi odpowiednich warunków (patrz argumenty warning
i error
w ?tryCatch
). Mogą to być funkcje, które już istnieją, ale możesz je również zdefiniować w tryCatch
(tak jak to zrobiliśmy powyżej).
Implikacje wyboru określonych wartości zwracanych przez funkcje obsługi
Jak ustaliliśmy, że NA
powinien zostać zwrócony w przypadku błędu w „części próbnej”, trzecim elementem y
jest NA
. Gdybyśmy wybrali NULL
jako wartość zwracaną, długość y
byłaby po prostu 2
zamiast 3
ponieważ lapply
po prostu „ignoruje / upuszcza” zwracane wartości, które są NULL
. Zauważ również, że jeśli nie określisz wyraźnej wartości zwracanej przez return
, funkcje modułu obsługi zwrócą NULL
(tj. W przypadku błędu lub warunku ostrzegawczego ).
Komunikat ostrzegawczy „niepożądany”
Kiedy trzeci element naszego urls
trafi w naszą funkcję, otrzymujemy następujące ostrzeżenie oprócz faktu, że wystąpił błąd ( readLines
najpierw skarży się, że nie może otworzyć połączenia za pomocą ostrzeżenia, zanim faktycznie zawiedzie z błędem ):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Błąd „wygrywa” nad ostrzeżeniem , więc tak naprawdę nie jesteśmy zainteresowani ostrzeżeniem w tym konkretnym przypadku. Dlatego ustawiliśmy warn = FALSE
w readLines
, ale to nie wydaje się mieć żadnego efektu. Alternatywnym sposobem eliminacji ostrzeżenia jest użycie
suppressWarnings(readLines(con = url))
zamiast
readLines(con = url, warn = FALSE)
Korzystanie z tryCatch ()
Definiujemy solidną wersję funkcji, która odczytuje kod HTML z danego adresu URL. Solidny w tym sensie, że chcemy, aby poradził sobie z sytuacjami, w których coś pójdzie nie tak (błąd) lub niezupełnie tak, jak to zaplanowaliśmy (ostrzeżenie). Ogólny termin na błędy i ostrzeżenia to warunek
Definicja funkcji za pomocą 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)
}
Testowanie rzeczy
Zdefiniujmy wektor adresów URL, w których jeden element nie jest prawidłowym adresem URL
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"
)
I przekaż to jako dane wejściowe do funkcji, którą zdefiniowaliśmy powyżej
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
Badanie wyników
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