Menu
Coddy logo textTech

tryCatch() ile Yakalama

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

tryCatch(expr, error = function(e) ...), expr ifadesini çalıştırır. Bir hata oluşturursa işleyici bunun yerine çalışır ve değeri sonuç olur; betik çalışmaya devam eder:

safe_sqrt <- function(x) {
  tryCatch(sqrt(x), error = function(e) NA)
}
print(safe_sqrt(16))
print(safe_sqrt("a"))
print("still running")

Çıktı:

[1] 4
[1] NA
[1] "still running"

İşleyici hatayı e olarak alır ve conditionMessage(e) onun mesaj metnini döndürür:

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

Çıktı:

[1] "Problem: file not found"

Yalnızca başarısız olabilecek çağrıyı sarmalayın ve varsayılan bir değer ya da kullanıcıya gösterilecek bir mesaj gibi yararlı bir şey yapabileceğiniz yerde yakalayın:

to_number <- function(s) {
  tryCatch({
    if (s == "") stop("empty input")
    as.integer(s)
  }, error = function(e) -1L)
}
print(to_number("42"))
print(to_number(""))

Çıktı:

[1] 42
[1] -1

Bir döngüde tryCatch(), diğerleri işlenmeye devam ederken hatalı bir öğenin başarısız olmasına izin verir:

inputs <- list(4, "x", 9)
for (v in inputs) {
  r <- tryCatch(sqrt(v), error = function(e) "not a number")
  cat(format(v), "->", r, "\n")
}

Çıktı:

4 -> 2 
x -> not a number 
9 -> 3 
challenge icon

Görev

Kolay

safe_divide(a, b) işlevini tamamla. tryCatch() kullan: içinde, b 0 olduğunda division by zero hatasını oluştur ve aksi takdirde a / b işlemini hesapla. İşleyici, Error: ifadesinin ardından mesajı döndürür. Sonucu metin olarak iki ondalık basamağa yuvarlanmış şekilde (3.33) veya hata metni olarak döndür.

Sağlanan kod, virgüllerle ayrılmış 10/3 gibi sayı çiftlerini okur ve her çiftin sonucunu kendi satırına yazdırır.

Kendin dene

safe_divide <- function(a, b) {
  # Kodunuzu buraya yazın
  ""
}

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