Menu
CoddyTech

Menangani error dengan tryCatch()

Termasuk bagian Logika dan Alur dalam perjalanan R di Coddy. Pelajaran 53 dari 64.

tryCatch(expr, error = function(e) ...) menjalankan expr. Jika terjadi error, handler akan dijalankan sebagai gantinya dan nilainya menjadi hasil, lalu skrip berlanjut:

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"

Handler menerima error sebagai e, dan conditionMessage(e) mengembalikan teks pesannya:

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

Output:

[1] "Problem: file not found"

Bungkus hanya pemanggilan yang bisa gagal, lalu tangani kegagalannya di tempat kamu bisa melakukan sesuatu yang berguna, seperti memberikan nilai default atau pesan kepada pengguna:

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] -1

Dalam perulangan, tryCatch() memungkinkan satu item yang bermasalah gagal sementara item lainnya tetap diproses:

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 
challenge icon

Tantangan

Mudah

Lengkapi safe_divide(a, b). Gunakan tryCatch(): di dalamnya, munculkan error division by zero saat b bernilai 0, dan jika tidak, hitung a / b. Penangan mengembalikan Error: diikuti pesannya. Kembalikan hasil yang dibulatkan hingga dua angka desimal sebagai teks, 3.33, atau teks error.

Kode yang disediakan membaca pasangan angka seperti 10/3, yang dipisahkan dengan koma, lalu mencetak hasil setiap pasangan pada baris tersendiri.

Coba sendiri

safe_divide <- function(a, b) {
  # Tulis kodemu di sini
  ""
}

# Kode input/output yang disediakan: biarkan apa adanya
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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler R online