Gestire gli errori con tryCatch()
Fa parte della sezione Logica e flusso del percorso R di Coddy. Lezione 53 di 64.
tryCatch(expr, error = function(e) ...) esegue expr. Se genera un errore, viene eseguito il gestore e il suo valore diventa il risultato, mentre lo script continua:
safe_sqrt <- function(x) {
tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")Output:
[1] 4
[1] NA
[1] "still running"Il gestore riceve l'errore come e e conditionMessage(e) restituisce il testo del suo messaggio:
result <- tryCatch(
stop("file not found"),
error = function(e) paste("Problem:", conditionMessage(e))
)
print(result)Output:
[1] "Problem: file not found"Racchiudi solo la chiamata che può fallire e intercetta l'errore dove puoi fare qualcosa di utile, ad esempio fornire un valore predefinito o un messaggio per l'utente:
to_number <- function(s) {
tryCatch({
if (s == "") stop("empty input")
as.integer(s)
}, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))Output:
[1] 42
[1] -1In un ciclo, tryCatch() consente a un elemento problematico di fallire mentre gli altri continuano a essere elaborati:
inputs <- list(4, "x", 9)
for (v in inputs) {
r <- tryCatch(sqrt(v), error = function(e) "not a number")
cat(format(v), "->", r, "\n")
}Output:
4 -> 2
x -> not a number
9 -> 3 Sfida
FacileCompleta safe_divide(a, b). Usa tryCatch(): al suo interno, genera l’errore division by zero quando b è 0 e altrimenti calcola a / b. Il gestore restituisce Error: seguito dal messaggio. Restituisci il risultato arrotondato a due decimali come testo, 3.33, oppure il testo dell’errore.
Il codice fornito legge coppie di numeri come 10/3, separate da virgole, e stampa il risultato di ogni coppia su una riga a sé.
Provalo tu
safe_divide <- function(a, b) {
# Escribe tu código aquí
""
}
# Código de entrada/salida proporcionado: mantenlo tal 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 = "")
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Le stringhe in dettaglio
Sottostringhe con substr()Formattazione con sprintf()Dividere e unireRicerca nelle stringheSostituzione del testoRipasso - Generatore di nomi utente4Matrici
Creazione di matriciIndicizzazione delle matriciRiepiloghi di righe e colonneOperazioni aritmetiche con le matriciRipasso - Schema dei posti a sedere10Flusso di controllo avanzato
La funzione switch()ifelse() vettorialerepeat e breakFunzioni ricorsiveRiepilogo - Classificatore di voti2Ricerche chiave-valore
Ricerche in vettori con nomiControllare le chiaviAggiungere e rimuovere chiaviIterare sui nomiRiepilogo - Sportello titoli5Progetto - Registro dei voti
Aggiungere studentiRegistrare i voti8Ordinamento e raggruppamento
Ordinare i vettoriOrdinare in base a una chiaveRaggruppare con split()Riepiloghi dei gruppiRipasso - Classifica11Gestione degli errori
Generare errori con stop()Gestire gli errori con tryCatch()Avvisi e finallyConvalidare l'inputRiepilogo - Calcolatrice sicura3Insiemi e conteggio
Valori univociOperazioni sugli insiemiTest di appartenenzaConteggio con table()Riepilogo - Ospiti dell’evento6Le funzioni come valori
Funzioni anonimePassare funzioniRestituire funzioniClosure con statoRiepilogo - Regole di sconto9DataFrame
Creare DataFrameColonne e righeFiltrare le righeAggiungere e ordinareRiepilogo - Report delle vendite12Progetto - Gestione delle spese
Registrare le speseSpesa totaleEsercitati da solo: Compilatore R online