Menu
Coddy logo textTech

Mit tryCatch() abfangen

Teil des Abschnitts Logik und Ablaufsteuerung der R-Journey von Coddy. Lektion 53 von 64.

tryCatch(expr, error = function(e) ...) führt expr aus. Wenn dabei ein Fehler auftritt, wird stattdessen der Handler ausgeführt und sein Wert zum Ergebnis, und das Skript läuft weiter:

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

Ausgabe:

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

Der Handler empfängt den Fehler als e, und conditionMessage(e) gibt seinen Nachrichtentext zurück:

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

Ausgabe:

[1] "Problem: file not found"

Umschließe nur den Aufruf, der fehlschlagen kann, und fange den Fehler dort ab, wo du etwas Nützliches tun kannst, zum Beispiel einen Standardwert zurückgeben oder dem Benutzer eine Nachricht anzeigen:

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

Ausgabe:

[1] 42
[1] -1

In einer Schleife sorgt tryCatch() dafür, dass ein fehlerhaftes Element fehlschlagen kann, während die anderen weiterhin verarbeitet werden:

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

Ausgabe:

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

Aufgabe

Einfach

Vervollständige safe_divide(a, b). Verwende tryCatch(): Löse darin den Fehler division by zero aus, wenn b 0 ist, und berechne andernfalls a / b. Der Fehlerbehandler gibt Error: gefolgt von der Meldung zurück. Gib das auf zwei Dezimalstellen gerundete Ergebnis als Text, 3.33, oder den Fehlertext zurück.

Der bereitgestellte Code liest Zahlenpaare wie 10/3, die durch Kommas getrennt sind, und gibt das Ergebnis jedes Paars in einer eigenen Zeile aus.

Probier es selbst

safe_divide <- function(a, b) {
  # Schreibe deinen Code hier
  ""
}

# Bereitgestellter Ein-/Ausgabecode: belasse ihn unverändert
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik und Ablaufsteuerung

Übe selbstständig: Online-R-Compiler