Menu
Coddy logo textTech

Capturar con tryCatch()

Parte de la sección Lógica y flujo del Journey de R de Coddy. Lección 53 de 64.

tryCatch(expr, error = function(e) ...) ejecuta expr. Si genera un error, el controlador se ejecuta en su lugar y su valor se convierte en el resultado; el script continúa:

safe_sqrt <- function(x) {
  tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")

Salida:

[1] 4
[1] NA
[1] "still running"

El controlador recibe el error como e, y conditionMessage(e) devuelve el texto de su mensaje:

result <- tryCatch(
  stop("file not found"),
  error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)

Salida:

[1] "Problem: file not found"

Envuelve solo la llamada que puede fallar y captúrala donde puedas hacer algo útil, como proporcionar un valor predeterminado o mostrar un mensaje al usuario:

to_number <- function(s) {
  tryCatch({
    if (s == "") stop("empty input")
    as.integer(s)
  }, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))

Salida:

[1] 42
[1] -1

En un bucle, tryCatch() permite que un elemento problemático falle mientras los demás siguen procesándose:

inputs <- list(4, "x", 9)
for (v in inputs) {
  r <- tryCatch(sqrt(v), error = function(e) "not a number")
  cat(format(v), "->", r, "\n")
}

Salida:

4 -> 2 
x -> not a number 
9 -> 3 
challenge icon

Desafío

Fácil

Completa safe_divide(a, b). Usa tryCatch(): dentro de ella, genera el error division by zero cuando b es 0 y, de lo contrario, calcula a / b. El controlador devuelve Error: seguido del mensaje. Devuelve el resultado redondeado a dos decimales como texto, 3.33, o el texto del error.

El código proporcionado lee pares de números como 10/3, separados por comas, e imprime el resultado de cada par en su propia línea.

Pruébalo tú mismo

safe_divide <- function(a, b) {
  # Escribe tu código aquí
  ""
}

# Código de entrada/salida suministrado: déjalo como está
input <- suppressWarnings(readLines(file("stdin")))
for (pair in strsplit(input[1], ",")[[1]]) {
  p <- as.numeric(strsplit(pair, "/")[[1]])
  cat(safe_divide(p[1], p[2]), "\n", sep = "")
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo

Practica por tu cuenta: Compilador de R online