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] -1Dalam 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 Tantangan
MudahLengkapi 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 = "")
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Mendalami string
Substring dengan substr()Memformat dengan sprintf()Memisahkan dan MenggabungkanMencari stringMengganti TeksRangkuman: Pembuat Nama Pengguna4Matriks
Membuat MatriksMengakses Elemen MatriksRingkasan Baris dan KolomAritmetika MatriksRangkuman: Denah Tempat Duduk2Pencarian Nilai-Kunci
Pencarian pada Vector BernamaMemeriksa KunciMenambahkan dan Menghapus KunciMenelusuri NamaUlasan: Meja Saham5Proyek, Buku Nilai
Menambahkan SiswaMencatat Nilai8Pengurutan dan Pengelompokan
Mengurutkan VektorMengurutkan berdasarkan KunciMengelompokkan dengan split()Ringkasan KelompokUlasan: Papan Peringkat11Penanganan error
Memunculkan error dengan stop()Menangani error dengan tryCatch()Peringatan dan finallyMemvalidasi inputRangkuman: Kalkulator Aman3Set dan Penghitungan
Nilai UnikOperasi setPengujian KeanggotaanMenghitung dengan table()Ulasan: Tamu Acara6Fungsi sebagai Nilai
Fungsi AnonimMengirim FungsiMengembalikan FungsiClosure dengan StateRangkuman: Aturan Diskon9Data Frame
Membuat Data FrameKolom dan BarisMemfilter BarisMenambahkan dan MengurutkanRangkuman: Laporan Penjualan12Proyek: Pelacak Pengeluaran
Mencatat PengeluaranTotal PengeluaranLatihan sendiri: Compiler R online