Menu
Coddy logo textTech

stop() ile Hata Oluşturma

Coddy'nin R Journey'sinin Mantık ve Akış bölümünün bir parçası. Ders 52 / 64.

stop("message") bir hata oluşturur: işlev hemen durur, sonrasındaki hiçbir şey çalışmaz ve R mesajı yazdırır. Bir işlev çalışamayacağı bir girdi aldığında kullanın:

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

Çıktı:

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

Hata metni başarısız olan çağrıyı adlandırır ve Execution halted tüm betiğin durduğu anlamına gelir: son print() hiç çalışmadı. Bir hata, normal çıktıya değil hata akışına yazılır; bu nedenle Coddy'de herhangi bir hata veya uyarı yazdırıldığında test başarısız olur.

stopifnot() aynı anda birkaç koşulu denetler ve FALSE olan ilk koşul için bir hata oluşturur. Adlandırılmış bir koşul, adını ileti olarak kullanır:

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))

Çıktı:

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

Mesajı paste0() veya sprintf() ile değerlerden oluşturun; böylece okuyucu neyin yanlış olduğunu görür:

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))

Çıktı:

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

Hataları bir iş yapılmadan önce, fonksiyonun başında yükseltin. Erken durduran kontroller, geçerli girdiyi varsayabildiği için fonksiyonun geri kalanını basit tutar:

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

Görev

Kolay

make_order(item, qty, stock) işlevini tamamla. stop() ile hata oluştur:

  • qty 1'in altındaysa quantity must be at least 1
  • qty stock değerinden büyükse, örneğin only 3 left olacak şekilde only <stock> left

Aksi takdirde ordered <qty> x <item> döndür.

Sağlanan kod öğeyi, miktarı ve stok değerini okur, işlevini çağırır ve sonucu veya hata mesajının ardından Error: ifadesini yazdırır; bu nedenle hiçbir testte R'nin kendi hata metni gösterilmez.

Kendin dene

make_order <- function(item, qty, stock) {
  # Kodunuzu buraya yazın
  ""
}

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Mantık ve Akış bölümündeki tüm dersler

Kendi başına pratik yap: Online R derleyicisi