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

رفع الأخطاء باستخدام stop()

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

stop("message") يرفع خطأً: تتوقف الدالة فورًا، ولا يتم تنفيذ أي شيء بعدها، وتطبع R الرسالة. استخدمه عندما تتلقى دالة إدخالً لا يمكنها التعامل معه:

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

الناتج:

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

يذكر نص الخطأ الاستدعاء الذي فشل، وتعني Execution halted أن البرنامج النصي بأكمله قد توقّف: ولم يتم تنفيذ آخر print(). يُكتب الخطأ في تدفق الأخطاء، وليس في المخرجات العادية، لذلك يفشل الاختبار على Coddy عند طباعة أي خطأ أو تحذير.

تتحقق stopifnot() من عدة شروط في آنٍ واحد، وتُصدر خطأً عند أول شرط تكون قيمته FALSE. يستخدم الشرط المُسمّى اسمه بوصفه الرسالة:

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

المخرجات:

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

أنشئ الرسالة من القيم باستخدام paste0() أو sprintf()، حتى يرى القارئ ما الذي كان خاطئًا:

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

الناتج:

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

أثِر الأخطاء في بداية الدالة، قبل تنفيذ أي عمل. تحافظ عمليات التحقق التي تتوقف مبكرًا على بساطة بقية الدالة، لأنها تستطيع افتراض أن الإدخال صالح:

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

التحدي

سهل

أكمل make_order(item, qty, stock). ارفع خطأً باستخدام stop():

  • quantity must be at least 1 عندما تكون قيمة qty أقل من 1
  • only <stock> left عندما تكون قيمة qty أكبر من stock، مثل only 3 left

وإلا فأرجع ordered <qty> x <item>.

يقرأ الكود المزوَّد العنصر والكمية والمخزون، ويستدعي دالتك ويطبع إما نتيجتها أو Error: متبوعًا برسالة الخطأ، لذلك لا يعرض أي اختبار نص الخطأ الخاص بـ R.

جرّب بنفسك

make_order <- function(item, qty, stock) {
  # اكتب الكود الخاص بك هنا
  ""
}

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

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

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

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