tryCatch() لاسترداد الأخطاء
التقط الأخطاء والتحذيرات والرسائل وتعامل معها باستخدام tryCatch().
tryCatch() لاسترداد الأخطاء درس مجاني في R Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
ما هي tryCatch()؟
تتيح لك tryCatch() تشغيل تعبير واعتراض أي شروط (أخطاء أو تحذيرات أو رسائل) يصدرها. فإذا نجح التعبير، تُعاد قيمته. وإذا أصدر شرطًا، تُستدعى المعالِجة المطابقة بدلًا منه.
result <- tryCatch({
sqrt(16)
}, error = function(e) {
NA
})
cat('Result:', result, '\n')التقاط خطأ
عندما يستدعي التعبير داخل tryCatch() الدالة stop()، ينتقل التنفيذ إلى معالِج error. ويتلقى المعالِج كائن الشرط ويعيد قيمته باعتبارها نتيجة استدعاء tryCatch() بأكمله.
safe_divide <- function(x, y) {
tryCatch({
if (y == 0) stop('division by zero')
x / y
}, error = function(e) {
cat('Caught error:', conditionMessage(e), '\n')
NA
})
}
cat(safe_divide(10, 2), '\n')
cat(safe_divide(10, 0), '\n')التقاط تحذير
تعمل معالِجة warning بالطريقة نفسها التي تعمل بها معالِجة error، لكنها تعترض شروط التحذير. ملاحظة: بمجرد تعريف معالِجة warning في tryCatch()، تؤدي التحذيرات إلى خروج غير محلي، مثل الأخطاء تمامًا — ولا يُستأنف التنفيذ بعد التحذير.
result <- tryCatch({
log(-1)
}, warning = function(w) {
cat('Warning caught:', conditionMessage(w), '\n')
-999
})
cat('Result:', result, '\n')التقاط رسالة
يمكنكم أيضًا التقاط شروط message(). يتيح لكم ذلك اعتراض المخرجات المعلوماتية من الدوال التي لا تتحكمون بها وإعادة تنسيقها. يتلقى المعالج كائن الشرط، ويتضمن نص الرسالة سطرًا جديدًا في نهايته.
result <- tryCatch({
message('Loading data...')
42
}, message = function(m) {
cat('Intercepted message:', trimws(conditionMessage(m)), '\n')
-1
})
cat('Result:', result, '\n')جملة finally
تُنفَّذ كتلة finally دائمًا بعد التعبير، سواء نجح أو حدث فيه خطأ أو أصدر تحذيرًا. استخدموها لتنفيذ تعليمات التنظيف، مثل إغلاق الاتصالات أو إعادة ضبط الخيارات أو تسجيل اكتمال العملية.
result <- tryCatch({
cat('Trying...\n')
stop('oops')
}, error = function(e) {
cat('Handled:', e$message, '\n')
-1
}, finally = {
cat('Finally block always runs\n')
})
cat('Result:', result, '\n')معالجات متعددة
يمكنكم توفير معالجات لأنواع متعددة من الشروط ضمن استدعاء واحد لـ tryCatch(). تطابق R أول معالج منطبق. إذا عُرِّفت معالجات لكل من error وwarning، فستُلتقط التحذيرات قبل أن تتحول إلى أخطاء.
handle_it <- function(expr_result) {
tryCatch(expr_result,
error = function(e) paste('ERROR:', e$message),
warning = function(w) paste('WARN:', w$message),
message = function(m) paste('MSG:', trimws(m$message))
)
}
cat(handle_it(stop('bad input')), '\n')
cat(handle_it(log(-1)), '\n')التعافي من الأخطاء داخل حلقة
من الأنماط العملية جدًا إحاطة جسم الحلقة بـ tryCatch() حتى لا يؤدي فشل تكرار واحد إلى إيقاف الحلقة بأكملها. وهذا ضروري عند معالجة الملفات أو استدعاءات API أو مدخلات المستخدم التي قد تفشل بصورة غير متوقعة.
inputs <- list(4, -1, 0, 16, 'x')
results <- vector('list', length(inputs))
for (i in seq_along(inputs)) {
results[[i]] <- tryCatch(
sqrt(as.numeric(inputs[[i]])),
warning = function(w) NA,
error = function(e) NA
)
}
cat('Results:', unlist(results), '\n')إرجاع قيم افتراضية مفيدة عند حدوث خطأ
من الأنماط الجيدة إرجاع قيمة افتراضية مناسبة من معالج الخطأ. وتصبح القيمة التي يُرجعها المعالج نتيجة tryCatch(). ويصلح إرجاع NA أو NULL أو 0 أو قائمة افتراضية.
safe_parse <- function(x) {
tryCatch(
as.numeric(x),
warning = function(w) {
cat('Cannot parse:', x, '-> using 0\n')
0
}
)
}
cat(safe_parse('3.14'), '\n')
cat(safe_parse('abc'), '\n')
cat(safe_parse('99'), '\n')استخراج رسالة الخطأ
داخل معالج الأخطاء، استخدموا conditionMessage(e) أو الاختصار e$message للحصول على نص الخطأ. واستخدموا conditionCall(e) أو e$call للحصول على الاستدعاء الذي أدى إليه.
tryCatch(
stop('file not found: data.csv'),
error = function(e) {
cat('Message:', conditionMessage(e), '\n')
cat('Class :', paste(class(e), collapse=', '), '\n')
}
)tryCatch() مقابل try()
تتضمن R أيضًا الدالة الأبسط try(expr). فعند حدوث خطأ، تُرجع كائنًا من الفئة 'try-error' بدلًا من إيقاف التنفيذ. استخدموا try() للتعبيرات المختصرة في سطر واحد، واستخدموا tryCatch() عند الحاجة إلى تحكم كامل بالمعالجات أو إلى كتلة finally.
# try() returns try-error object on failure
result <- try(log('x'), silent = TRUE)
if (inherits(result, 'try-error')) {
cat('try() caught error\n')
} else {
cat('Result:', result, '\n')
}تداخل استدعاءات tryCatch()
يمكن تداخل استدعاءات tryCatch(). يلتقط الاستدعاء الداخلي لـ tryCatch() الشروط أولًا؛ وإذا أعاد إطلاقها باستخدام stop(e)، يلتقط المعالج الخارجي الشرط المُعاد إطلاقه.
outer_result <- tryCatch({
tryCatch({
stop('inner error')
}, error = function(e) {
cat('Inner handler, re-throwing\n')
stop(paste('Wrapped:', e$message))
})
}, error = function(e) {
cat('Outer handler:', e$message, '\n')
'recovered'
})
cat('Final:', outer_result, '\n')تحقق سريع
في tryCatch()، أي جملة تُنفَّذ دائمًا بغض النظر عن حدوث خطأ من عدمه؟
tryCatch(): أهم النقاط
أهم النقاط حول tryCatch():
- اعترضوا الأخطاء باستخدام
error = function(e) {...}، والتحذيرات باستخدامwarning = function(w) {...} - تصبح القيمة التي يُرجعها المعالج نتيجة
tryCatch() - تُنفَّذ
finallyدائمًا، مما يجعلها مثالية للتنظيف - أحيطوا أجسام الحلقات بـ
tryCatch()لتنفيذ التكرار بصورة موثوقة على المدخلات غير المضمونة - يستخرج
e$messageأوconditionMessage(e)نص الخطأ - يُعد
try(expr, silent=TRUE)بديلًا أبسط في سطر واحد
safe_op <- function(x) {
tryCatch({
if (!is.numeric(x)) stop('not numeric')
sqrt(x)
}, error = function(e) {
cat('Error:', e$message, '\n')
NA
}, finally = {
cat('Done processing', x, '\n')
})
}
cat(safe_op(9), '\n')
cat(safe_op('a'), '\n')الأسئلة الشائعة
هل درس «tryCatch() لاسترداد الأخطاء» مجاني؟
نعم — نص درس «tryCatch() لاسترداد الأخطاء» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «tryCatch() لاسترداد الأخطاء»؟
التقط الأخطاء والتحذيرات والرسائل وتعامل معها باستخدام tryCatch(). تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «tryCatch() لاسترداد الأخطاء»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأخطاء والتحذيرات والرسائل في R
- tryCatch() لاسترداد الأخطاء
- withCallingHandlers() وإعادات التشغيل
- كتابة دوال متينة باستخدام stop() وwarning()