رفع الأخطاء باستخدام 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
}التحدي
سهلأكمل make_order(item, qty, stock). ارفع خطأً باستخدام stop():
quantity must be at least 1عندما تكون قيمةqtyأقل من 1only <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")
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس المنطق وتدفق التنفيذ
1السلاسل النصية بعمق
السلاسل الفرعية باستخدام substr()التنسيق باستخدام sprintf()التقسيم والضمالبحث في السلاسل النصيةاستبدال النصوصمراجعة - منشئ اسم المستخدم4المصفوفات
إنشاء المصفوفاتفهرسة المصفوفاتملخصات الصفوف والأعمدةالحساب على المصفوفاتمراجعة - مخطط المقاعد2استرجاع القيم باستخدام المفاتيح
البحث في المتجهات المُسمّاةالتحقق من المفاتيحإضافة المفاتيح وإزالتهاالتكرار عبر الأسماءمراجعة - مكتب الأسهم8الفرز والتجميع
فرز المتجهاتالفرز حسب مفتاحالتجميع باستخدام split()ملخصات المجموعاتمراجعة - لوحة المتصدرين11معالجة الأخطاء
رفع الأخطاء باستخدام stop()التقاط الأخطاء باستخدام tryCatch()التحذيرات وfinallyالتحقق من صحة الإدخالمراجعة - آلة حاسبة آمنةتدرّب بنفسك: مترجم R عبر الإنترنت