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