R Language
Código tolerante a fallas / resistente
Buscar..
Parámetros
Parámetro | Detalles |
---|---|
expr | En caso de que la "parte de prueba" se completara exitosamente, tryCatch devolverá la última expresión evaluada . Por lo tanto, el valor real que se devuelve en caso de que todo haya ido bien y no haya ninguna condición (es decir, una advertencia o un error ) es el valor de retorno de readLines . Tenga en cuenta que no necesita indicar explícitamente el valor de retorno a través del return ya que el código en la "parte de prueba" no se incluye en un entorno de funciones (a diferencia de los controladores de condición para advertencias y errores a continuación) |
advertencia / error / etc | Proporcione / defina una función de controlador para todas las condiciones que quiera manejar explícitamente. AFAIU, puede proporcionar manejadores para cualquier tipo de condiciones (no solo advertencias y errores , sino también condiciones personalizadas ; consulte simpleCondition y amigos), siempre y cuando el nombre de la función del manejador respectivo coincida con la clase de la condición respectiva (vea el Detalles de la parte del documento para tryCatch ). |
finalmente | Aquí va todo lo que debe ejecutarse al final, independientemente de si la expresión en la "parte de prueba" tuvo éxito o si hubo alguna condición. Si desea que se ejecute más de una expresión, entonces debe ajustarlas entre corchetes, de lo contrario, podría haber escrito finally = <expression> (es decir, la misma lógica que para "probar parte"). |
Observaciones
tryCatch
tryCatch
devuelve el valor asociado a la ejecución de expr
menos que exista una condición: una advertencia o un error. Si ese es el caso, los valores de retorno específicos (p. Ej., El return(NA)
anterior) se pueden especificar proporcionando una función de controlador para las condiciones respectivas (consulte los argumentos warning
y error
en ?tryCatch
). Estas pueden ser funciones que ya existen, pero también puede definirlas dentro de tryCatch
(como hicimos anteriormente).
Implicaciones de elegir valores de retorno específicos de las funciones del controlador
Como hemos especificado que NA
debe devolverse en caso de un error en la "parte de prueba", el tercer elemento en y
es NA
. Si hubiésemos elegido NULL
para ser el valor de retorno, la longitud de y
solo habría sido 2
lugar de 3
ya que lapply
simplemente "ignorará / caerá" los valores de retorno que sean NULL
. También tenga en cuenta que si no especifica un valor de retorno explícito a través de return
, las funciones del controlador devolverán NULL
(es decir, en caso de un error o una condición de advertencia ).
Mensaje de advertencia "no deseado"
Cuando el tercer elemento de nuestro vector urls
llega a nuestra función, recibimos la siguiente advertencia además del hecho de que se produce un error ( readLines
primero se queja de que no puede abrir la conexión a través de una advertencia antes de fallar con un error ):
Warning message:
In file(con, "r") : cannot open file 'I'm no URL': No such file or directory
Un error "gana" sobre una advertencia , por lo que no estamos realmente interesados en la advertencia en este caso en particular. Por lo tanto, hemos configurado warn = FALSE
en readLines
, pero eso no parece tener ningún efecto. Una forma alternativa de suprimir la advertencia es usar
suppressWarnings(readLines(con = url))
en lugar de
readLines(con = url, warn = FALSE)
Usando tryCatch ()
Estamos definiendo una versión robusta de una función que lee el código HTML de una URL determinada. Robusto en el sentido de que queremos que maneje situaciones en las que algo salga mal (error) o no de la forma en que lo planeamos (advertencia). El término paraguas para errores y advertencias es condición
Definición de funciones usando 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)
}
Probando cosas
Definamos un vector de URL donde un elemento no es una URL válida
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"
)
Y pase esto como entrada a la función que definimos anteriormente
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
Investigando la salida
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