Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

التقاط الأخطاء باستخدام tryCatch()

جزء من قسم المنطق وتدفق التنفيذ في رحلة R على Coddy. الدرس 53 من 64.

tryCatch(expr, error = function(e) ...) ينفّذ expr. إذا تسبّب في حدوث خطأ، فسيُنفَّذ المعالج بدلًا منه، وتصبح قيمته هي النتيجة، ويستمر البرنامج النصي:

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

المخرجات:

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

يتلقى معالج الأخطاء الخطأ باعتباره e، وتُرجع conditionMessage(e) نص رسالته:

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

الناتج:

[1] "Problem: file not found"

غلّف الاستدعاء الذي قد يفشل فقط، والتقط الخطأ حيث يمكنك فعل شيء مفيد، مثل استخدام قيمة افتراضية أو عرض رسالة للمستخدم:

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

الناتج:

[1] 42
[1] -1

في حلقة، تتيح tryCatch() فشل عنصر واحد سيئ بينما تستمر معالجة العناصر الأخرى:

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

المخرجات:

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

التحدي

سهل

أكمل safe_divide(a, b). استخدم tryCatch(): ارفع الخطأ division by zero بداخله عندما تكون قيمة b تساوي 0، وإلا فاحسب a / b. يعيد المعالج Error: متبوعًا بالرسالة. أعد النتيجة مقربة إلى منزلتين عشريتين كنص، مثل 3.33، أو نص الخطأ.

يقرأ الكود المقدم أزواجًا من الأرقام مثل 10/3، مفصولة بفواصل، ويطبع نتيجة كل زوج في سطر مستقل.

جرّب بنفسك

safe_divide <- function(a, b) {
  # اكتب الكود الخاص بك هنا
  ""
}

# كود الإدخال/الإخراج المُزوَّد: أبقه كما هو
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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس المنطق وتدفق التنفيذ

تدرّب بنفسك: مترجم R عبر الإنترنت