الأخطاء والتحذيرات والرسائل في R
افهم أنواع الإشارات الثلاثة ومتى يُطلَق كل منها.
الأخطاء والتحذيرات والرسائل في R درس مجاني في R Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في R Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة R Academy 4 دروس في المجموع.
نظام الشروط في R
يمتلك R نظام شروط رسميًا للتواصل بشأن المشكلات. وتوجد ثلاث فئات رئيسية للشروط: الأخطاء (قاتلة — توقف التنفيذ)، والتحذيرات (غير قاتلة — تُطبع بعد انتهاء تنفيذ الشيفرة)، والرسائل (معلوماتية — تُرسل إلى stderr).
# Each condition type behaves differently
message('This is a message')
warning('This is a warning')
# stop() would halt here, so wrap it
tryCatch(stop('This is an error'), error = function(e) print(e))stop() — إنشاء الأخطاء
تشير stop(msg) إلى وجود شرط خطأ. ويتوقف التنفيذ فورًا وتُعرض رسالة الخطأ. وتُستخدم داخل الدوال لإيقاف التنفيذ عندما تكون المدخلات غير صالحة أو عند اكتشاف حالة لا يمكن استردادها.
divide <- function(x, y) {
if (y == 0) stop('Division by zero is not allowed')
x / y
}
tryCatch(divide(10, 0), error = function(e) cat('Error:', conditionMessage(e), '\n'))
divide(10, 2)warning() — تحذيرات غير قاتلة
تشير warning(msg) إلى وجود شرط تحذير. وبخلاف الأخطاء، لا توقف التحذيرات التنفيذ — بل تتابع الدالة عملها ويُجمَع التحذير. وتُطبع التحذيرات افتراضيًا بعد انتهاء تنفيذ الشيفرة، أو فورًا عند ضبط options(warn=1).
safe_sqrt <- function(x) {
if (x < 0) {
warning('Negative input; returning NaN')
return(NaN)
}
sqrt(x)
}
result <- safe_sqrt(-4)
cat('Result:', result, '\n')message() — شروط معلوماتية
تشير message(msg) إلى وجود شرط رسالة. وتُرسل إلى stderr، وتتضمن سطرًا جديدًا تلقائيًا، ويمكن منعها باستخدام suppressMessages(). استخدمها لتحديثات التقدم داخل الدوال، لا للأخطاء أو التحذيرات.
load_data <- function(n) {
message('Loading ', n, ' records...')
seq_len(n)
}
data <- suppressMessages(load_data(100))
cat('Got', length(data), 'records\n')كائنات simpleError وsimpleWarning
عندما ينشئ R شرطًا، فإنه يغلّف الرسالة داخل كائن شرط. وتنشئ simpleError('msg') وsimpleWarning('msg') كائنات شروط يدويًا. ويمكنك فحصها باستخدام conditionMessage().
e <- simpleError('something went wrong')
w <- simpleWarning('this looks suspicious')
cat('Error class :', class(e), '\n')
cat('Warning class :', class(w), '\n')
cat('Error message :', conditionMessage(e), '\n')
cat('Warning msg :', conditionMessage(w), '\n')conditionMessage() وconditionCall()
تستخرج conditionMessage(cond) الرسالة النصية من أي كائن شرط. وتستخرج conditionCall(cond) الاستدعاء الذي أدى إلى تشغيل الشرط. ويفيد كلاهما داخل معالجات الأخطاء لتسجيل الشروط أو إعادة إرسالها.
tryCatch(
log(-1),
warning = function(w) {
cat('Caught warning :', conditionMessage(w), '\n')
cat('From call :', deparse(conditionCall(w)), '\n')
}
)options(warn = 2) — معاملة التحذيرات كأخطاء
يحوّل ضبط options(warn = 2) جميع التحذيرات إلى أخطاء، مما يؤدي إلى إيقاف التنفيذ فورًا. ويفيد ذلك أثناء التطوير لاكتشاف الشيفرة التي تولد تحذيرات في وقت مبكر. ويمكن استعادة السلوك السابق باستخدام options(warn = 0).
old_warn <- options(warn = 0) # default: collect warnings
log(-1) # just a warning
options(warn = 0)
tryCatch({
options(warn = 2)
log(-1) # now fatal
}, error = function(e) cat('Caught as error:', conditionMessage(e), '\n'),
finally = options(old_warn))التحذيرات الفورية مقابل المؤجلة
مع options(warn = 0) (الإعداد الافتراضي)، تُجمَع التحذيرات وتُطبع في النهاية. ومع options(warn = 1) يُطبع كل تحذير فور حدوثه. أما مع warn = 2 فتتحول التحذيرات إلى أخطاء.
# warn=1: print warnings immediately as they happen
old <- options(warn = 1)
result1 <- log(-1)
result2 <- sqrt(-4)
cat('Results:', result1, result2, '\n')
options(old)الخطأ مقابل التحذير: قاتل مقابل غير قاتل
التمييز الحاسم هو أن الخطأ يوقف التنفيذ بالكامل ما لم تلتقطه معالِجة، بينما يُسجَّل التحذير ويستمر التنفيذ. وهذا يعني أن المدخلات غير الصحيحة قد تنتج نتائج خاطئة بصمت إذا استخدمت التحذيرات حيث ينبغي استخدام الأخطاء.
# With warning: execution continues
f_warn <- function(x) { if (x < 0) warning('negative'); x^2 }
cat('warn result:', f_warn(-3), '\n') # still computes 9
# With error: execution stops
f_stop <- function(x) { if (x < 0) stop('negative'); x^2 }
tryCatch(f_stop(-3), error = function(e) cat('stopped:', e$message, '\n'))تداخل الشروط
يمكن رفع الشروط داخل معالجات شروط أخرى. إذ يمكن لمعالِج تحذير استدعاء stop() لتحويل التحذير إلى خطأ. وهذا نمط شائع لجعل الشيفرة التابعة لجهات خارجية أكثر صرامة.
strict_log <- function(x) {
withCallingHandlers(
log(x),
warning = function(w) {
stop(paste('Strict mode: warning treated as error:', conditionMessage(w)))
}
)
}
tryCatch(strict_log(-1), error = function(e) cat('Error:', e$message, '\n'))
cat('log(4) =', strict_log(4), '\n')suppressWarnings() وsuppressMessages()
تقيّم suppressWarnings(expr) التعبير مع التقاط جميع التحذيرات والتخلص منها بصمت. وتفعل suppressMessages(expr) الشيء نفسه مع شروط الرسائل. استخدم هاتين الدالتين باعتدال، إذ قد يؤدي منع التحذيرات إلى إخفاء مشكلات حقيقية.
# Without suppression: warning shown
result1 <- log(-1)
# With suppression: warning hidden
result2 <- suppressWarnings(log(-1))
cat('Both are NaN:', is.nan(result1), is.nan(result2), '\n')تحقق سريع
أي العبارات التالية حول warning() مقابل stop() صحيحة؟
الشروط: أهم النقاط
أهم النقاط المتعلقة بشروط R:
stop()= خطأ = قاتل، يوقف التنفيذ فورًا؛ وwarning()= غير قاتل، يستمر التنفيذ؛ وmessage()= معلوماتية، تُرسل إلى stderr- تنشئ الدوال الثلاث كائنات شروط ذات تسلسل هرمي للفئات
- تستخرج
conditionMessage(e)النص من أي شرط - يطبع
options(warn=1)التحذيرات فورًا؛ ويعاملwarn=2التحذيرات كأخطاء - يكتم
suppressWarnings()وsuppressMessages()الشروط - فضّل
stop()للمدخلات غير الصالحة عندما يكون الاستمرار في التنفيذ خاطئًا
# Summary of the three condition functions
tryCatch({
message('Step 1 starting')
warning('something looks odd')
stop('cannot continue')
}, message = function(m) cat('MSG:', conditionMessage(m)),
warning = function(w) cat('WARN:', conditionMessage(w), '\n'),
error = function(e) cat('ERR:', conditionMessage(e), '\n'))تعلم R مع معلم ذكاء اصطناعي — مجانًا
اكتب وقم بتشغيل أكوادك الفعلية في المتصفح، واحصل على مساعدة فورية من معلم ذكاء اصطناعي متاح 24/7، واستمر من حيث توقفت على الويب أو في التطبيق.
- الدورات
- 43
- الدروس
- 159
الأسئلة الشائعة
هل درس «الأخطاء والتحذيرات والرسائل في R» مجاني؟
نعم — نص درس «الأخطاء والتحذيرات والرسائل في R» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة R Academy، انتقل إلى CoddyKit PRO. تتضمن دورة R Academy 4 دروس في المجموع.
ماذا ستتعلم في «الأخطاء والتحذيرات والرسائل في R»؟
افهم أنواع الإشارات الثلاثة ومتى يُطلَق كل منها. تتمرن على R Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ R Academy؟
لا تُشترط خبرة سابقة. R Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «الأخطاء والتحذيرات والرسائل في R»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس R Academy هذا؟
نعم. كل درس في R Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- الأخطاء والتحذيرات والرسائل في R
- tryCatch() لاسترداد الأخطاء
- withCallingHandlers() وإعادات التشغيل
- كتابة دوال متينة باستخدام stop() وwarning()