Menu
CoddyTech

Memunculkan error dengan stop()

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

stop("message") memunculkan error: fungsi langsung berhenti, tidak ada kode setelahnya yang dijalankan, dan R mencetak pesan tersebut. Gunakan fungsi ini saat sebuah fungsi menerima input yang tidak dapat digunakan:

check_qty <- function(q) {
  if (q <= 0) stop("quantity must be positive")
  q
}
print(check_qty(3))
print(check_qty(-1))
print("never printed")

Output:

[1] 3
Error in check_qty(-1) : quantity must be positive
Calls: print -> check_qty
Execution halted

Teks error menyebut pemanggilan yang gagal, dan Execution halted berarti seluruh skrip berhenti: print() terakhir tidak pernah dijalankan. Error ditulis ke aliran error, bukan ke output normal, jadi di Coddy sebuah tes gagal ketika error atau peringatan apa pun dicetak.

stopifnot() memeriksa beberapa kondisi sekaligus dan memunculkan error untuk kondisi pertama yang bernilai FALSE. Kondisi bernama menggunakan namanya sebagai pesan:

area <- function(w, h) {
  stopifnot("width must be positive" = w > 0, "height must be positive" = h > 0)
  w * h
}
print(area(2, 3))
print(area(2, -1))

Output:

[1] 6
Error in area(2, -1) : height must be positive
Calls: print -> area -> stopifnot
Execution halted

Susun pesan dari nilai-nilai dengan paste0() atau sprintf(), agar pembaca tahu apa yang salah:

get_item <- function(items, i) {
  if (i > length(items)) stop(sprintf("index %d is past the end (%d items)", i, length(items)))
  items[i]
}
print(get_item(c("a", "b"), 5))

Output:

Error in get_item(c("a", "b"), 5) : index 5 is past the end (2 items)
Calls: print -> get_item
Execution halted

Timbulkan error di awal fungsi, sebelum pekerjaan apa pun dilakukan. Pemeriksaan yang berhenti lebih awal membuat bagian fungsi lainnya tetap sederhana, karena bagian tersebut dapat mengasumsikan bahwa input valid:

withdraw <- function(balance, amount) {
  if (amount <= 0) stop("amount must be positive")
  if (amount > balance) stop("insufficient funds")
  balance - amount
}
challenge icon

Tantangan

Mudah

Lengkapi make_order(item, qty, stock). Picu error dengan stop():

  • quantity must be at least 1 jika qty kurang dari 1
  • only <stock> left jika qty lebih besar dari stock, seperti only 3 left

Jika tidak, kembalikan ordered <qty> x <item>.

Kode yang disediakan membaca item, jumlah, dan stok, memanggil fungsimu, lalu mencetak hasilnya atau Error: diikuti pesan error, jadi kasus uji tidak pernah menampilkan teks error bawaan R.

Coba sendiri

make_order <- function(item, qty, stock) {
  # Tulis kodemu di sini
  ""
}

# Kode input/output yang disediakan: biarkan apa adanya
input <- suppressWarnings(readLines(file("stdin")))
result <- tryCatch(make_order(input[1], as.numeric(input[2]), as.numeric(input[3])),
                   error = function(e) paste("Error:", conditionMessage(e)))
cat(result, sep = "\n")
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