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] -1In 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 Aufgabe
EinfachVervollstä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 = "")
}
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
1Strings im Detail
Teilstrings mit substr()Formatierung mit sprintf()Aufteilen und VerbindenStrings durchsuchenText ersetzenWiederholung – Benutzernamen-Generator4Matrizen
Matrizen erstellenMatrizen indizierenZusammenfassungen von Zeilen und SpaltenMatrizenarithmetikRückblick – Sitzplan10Fortgeschrittener Kontrollfluss
Die switch()-FunktionVektorisierter ifelse()repeat und breakRekursive FunktionenRückblick – Notenklassifizierung2Schlüssel-Wert-Suchen
Benannte Vektor-SuchenSchlüssel prüfenSchlüssel hinzufügen und entfernenNamen durchlaufenRückblick – Aktienübersicht5Projekt – Notenbuch
Schüler hinzufügenNoten eintragen8Sortieren und Gruppieren
Vektoren sortierenNach einem Schlüssel sortierenGruppieren mit split()GruppenzusammenfassungenRückblick – Rangliste11Fehlerbehandlung
Fehler mit stop() auslösenMit tryCatch() abfangenWarnungen und finallyEingaben validierenZusammenfassung – Sicherer Rechner3Mengen und Zählen
Eindeutige WerteMengenoperationenZugehörigkeitstestsZählen mit table()Rückblick – Gäste einer Veranstaltung6Funktionen als Werte
Anonyme FunktionenFunktionen übergebenFunktionen zurückgebenClosures mit ZustandRückblick – Rabattregeln9Datenrahmen
Datenrahmen erstellenSpalten und ZeilenZeilen filternHinzufügen und SortierenZusammenfassung – Verkaufsbericht12Projekt – Ausgaben-Tracker
Ausgaben erfassenGesamtausgabenÜbe selbstständig: Online-R-Compiler