R Academy · पाठ

withCallingHandlers() और पुनःआरंभ

गैर-स्थानीय condition handling के लिए withCallingHandlers() का उपयोग करें।

पाठ 3, कुल 4 में से13 चरण

withCallingHandlers() और पुनःआरंभ, CoddyKit पर R Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह R Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

tryCatch बनाम withCallingHandlers

मुख्य अंतर यह है: tryCatch() एक गैर-स्थानीय निकास स्थापित करता है — स्थिति पकड़े जाने के बाद नियंत्रण अभिव्यक्ति से बाहर चला जाता है और वापस नहीं लौटता। withCallingHandlers() कॉल स्टैक को बनाए रखता है और हैंडलिंग के बाद निष्पादन जारी रख सकता है।

# tryCatch: execution does NOT continue after warning
tryCatch({
  warning('first')
  cat('This line is never reached\n')
}, warning = function(w) cat('tryCatch caught:', w$message, '\n'))

withCallingHandlers निष्पादन जारी रखता है

withCallingHandlers() के साथ हैंडलर चलता है, लेकिन स्थिति के संकेतित होने के बाद निष्पादन जारी रहता है (जब तक कि हैंडलर स्वयं त्रुटि न उत्पन्न करे या किसी रीस्टार्ट को न बुलाए)। कॉल स्टैक को खोला नहीं जाता।

withCallingHandlers({
  warning('first warning')
  cat('Execution continues here\n')
  warning('second warning')
  cat('And here too\n')
}, warning = function(w) {
  cat('Handler saw:', w$message, '\n')
  invokeRestart('muffleWarning')
})

muffleWarning रीस्टार्ट

चेतावनी हैंडलर के अंदर invokeRestart('muffleWarning') बुलाने से R का डिफ़ॉल्ट हैंडलर उस चेतावनी को प्रिंट नहीं करता। इसके बिना, आपके हैंडलर के चलने के बाद R अपने डिफ़ॉल्ट तंत्र के माध्यम से चेतावनी फिर भी प्रिंट करता।

# Without muffleWarning: warning still shows after handler
withCallingHandlers({
  warning('test')
}, warning = function(w) {
  cat('Handler ran\n')
  # no muffleWarning: default handler still fires
})

muffleMessage रीस्टार्ट

इसी तरह, संदेश हैंडलर के अंदर invokeRestart('muffleMessage') बुलाने से आपका कस्टम हैंडलर संदेश को संसाधित करने के बाद उसे शांत कर देता है। suppressMessages() इसी तंत्र पर आधारित है।

withCallingHandlers({
  message('Progress: 50%')
  message('Progress: 100%')
}, message = function(m) {
  cat('[LOG]', trimws(m$message), '\n')
  invokeRestart('muffleMessage')
})

बिना रोके चेतावनियों की लॉगिंग

withCallingHandlers() का एक व्यावहारिक उपयोग है: कोड को पूरा होने देते हुए चेतावनियों को एक लॉग वेक्टर में एकत्र करना। tryCatch() पहली चेतावनी पर रुक जाता, जबकि withCallingHandlers() उन सभी को एकत्र करता है।

warnings_log <- character(0)
result <- withCallingHandlers({
  x <- log(-1)
  y <- sqrt(-4)
  c(x, y)
}, warning = function(w) {
  warnings_log <<- c(warnings_log, w$message)
  invokeRestart('muffleWarning')
})
cat('Warnings logged:', length(warnings_log), '\n')
cat(warnings_log, sep = '\n')

invokeRestart() की अवधारणा

रीस्टार्ट पहले से परिभाषित पुनर्प्राप्ति रणनीतियाँ हैं, जिन्हें स्थिति का संकेत देने वाला कोड उपलब्ध करा सकता है। invokeRestart(name) उन रणनीतियों में से एक को चुनता है। अंतर्निहित रीस्टार्ट में 'muffleWarning' और 'muffleMessage' शामिल हैं; आप withRestarts() से कस्टम रीस्टार्ट परिभाषित कर सकते हैं।

# withRestarts() offers named recovery options
divide_safe <- function(x, y) {
  withRestarts(
    {
      if (y == 0) stop('division by zero')
      x / y
    },
    use_zero = function() 0,
    use_na   = function() NA
  )
}
# A handler can pick a restart
withCallingHandlers(
  divide_safe(10, 0),
  error = function(e) invokeRestart('use_zero')
)

withCallingHandlers और tryCatch को संयोजित करना

आप दोनों को नेस्ट कर सकते हैं: स्थितियों की लॉगिंग या गिनती के लिए बाहर withCallingHandlers() और वैकल्पिक मान देने के लिए अंदर tryCatch() का उपयोग करें। बाहर वाला हैंडलर स्थिति को पहले देखता है।

n_warnings <- 0L
result <- withCallingHandlers(
  tryCatch(log(-1), warning = function(w) -999),
  warning = function(w) {
    n_warnings <<- n_warnings + 1L
    cat('Logged warning #', n_warnings, '\n')
  }
)
cat('Result:', result, '\n')

कस्टम स्थिति श्रेणियाँ

आप c('myError', 'error', 'condition') श्रेणी वाली सूची पर structure() बुलाकर कस्टम स्थिति श्रेणियाँ बना सकते हैं। हैंडलर श्रेणी के आधार पर मिलान करते हैं, इसलिए कस्टम श्रेणियाँ सभी त्रुटियों को पकड़े बिना विशिष्ट त्रुटि प्रकारों को पकड़ने देती हैं।

my_error <- function(msg, data = NULL) {
  structure(
    class = c('my_error', 'error', 'condition'),
    list(message = msg, data = data)
  )
}
tryCatch(
  stop(my_error('custom error', data = 42)),
  my_error = function(e) cat('Custom handler, data=', e$data, '\n'),
  error    = function(e) cat('Generic handler\n')
)

withCallingHandlers का उपयोग कब करें

जब आप निष्पादन रोके बिना स्थितियों को देखना या उनकी लॉगिंग करना चाहते हों, तब withCallingHandlers() का उपयोग करें। जब आप किसी स्थिति से उबरकर वैकल्पिक मान लौटाना चाहते हों, तब tryCatch() का उपयोग करें। दोनों अलग-अलग समस्याओं का समाधान करते हैं।

# withCallingHandlers: observe all, continue
withCallingHandlers(
  for (x in c(4, -1, 9, -4)) cat(suppressWarnings(sqrt(x)), ''),
  warning = function(w) cat('[warn]', '')
)
cat('\n')

स्थिति संकेत श्रृंखला

जब किसी स्थिति का संकेत दिया जाता है, तो R हैंडलर खोजते हुए कॉल स्टैक में ऊपर की ओर चलता है। withCallingHandlers() के हैंडलर गतिशील संदर्भ में चलते हैं (कॉल स्टैक यथावत रहता है)। tryCatch() के हैंडलर स्टैक खुलने के बाद चलते हैं — मूल संदर्भ समाप्त हो चुका होता है।

# Demonstrate: withCallingHandlers handler can see full stack
f <- function() {
  withCallingHandlers(
    g(),
    warning = function(w) {
      cat('Caught in f, stack length:', sys.nframe(), '\n')
      invokeRestart('muffleWarning')
    }
  )
}
g <- function() warning('from g')
f()

suppressWarnings() का कार्यान्वयन

suppressWarnings(expr) मूलतः withCallingHandlers(expr, warning = function(w) invokeRestart('muffleWarning')) है। इसे समझने से आप अपने ऐसे रूप बना सकते हैं, जो केवल कुछ विशेष चेतावनी प्रकारों को दबाएँ।

# Suppress only NaN warnings, not others
suppress_nan_warn <- function(expr) {
  withCallingHandlers(expr, warning = function(w) {
    if (grepl('NaN', conditionMessage(w)))
      invokeRestart('muffleWarning')
  })
}
suppress_nan_warn(log(-1))   # NaN warning suppressed
tryCatch(
  suppress_nan_warn(warning('other issue')),
  warning = function(w) cat('Other warning kept:', w$message, '\n')
)

त्वरित जाँच

withCallingHandlers() और tryCatch() के बीच मुख्य अंतर क्या है?

रीस्टार्ट: मुख्य बातें

withCallingHandlers और रीस्टार्ट के लिए मुख्य बातें:

  • withCallingHandlers() = स्थानीय हैंडलर, कॉल स्टैक यथावत, निष्पादन जारी रह सकता है
  • tryCatch() = गैर-स्थानीय निकास, स्टैक खुल जाता है, वैकल्पिक मान लौटाया जा सकता है
  • invokeRestart('muffleWarning') चेतावनी के डिफ़ॉल्ट प्रिंट होने को दबाता है
  • invokeRestart('muffleMessage') संदेश के डिफ़ॉल्ट प्रिंट होने को दबाता है
  • रुके बिना सभी स्थितियों को एकत्र करने या उनकी लॉगिंग करने के लिए withCallingHandlers() का उपयोग करें
  • कस्टम स्थिति श्रेणियाँ विशिष्ट त्रुटि प्रकारों को चुनिंदा रूप से पकड़ने देती हैं
log_vec <- character(0)
withCallingHandlers({
  message('start')
  warning('low memory')
  message('end')
}, message = function(m) {
  log_vec <<- c(log_vec, paste('MSG:', trimws(m$message)))
  invokeRestart('muffleMessage')
}, warning = function(w) {
  log_vec <<- c(log_vec, paste('WARN:', w$message))
  invokeRestart('muffleWarning')
})
cat(log_vec, sep = '\n')
शुरुआत निःशुल्क

एआई शिक्षक के साथ R सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
43
पाठ
159

अक्सर पूछे जाने वाले प्रश्न

क्या “withCallingHandlers() और पुनःआरंभ” पाठ निःशुल्क है?

हाँ — R Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “withCallingHandlers() और पुनःआरंभ” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। R Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“withCallingHandlers() और पुनःआरंभ” में मैं क्या सीखूँगा?

गैर-स्थानीय condition handling के लिए withCallingHandlers() का उपयोग करें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ R Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या R Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर R Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“withCallingHandlers() और पुनःआरंभ” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस R Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर R Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. R में त्रुटियाँ, चेतावनियाँ और संदेश
  2. त्रुटि पुनर्प्राप्ति के लिए tryCatch()
  3. withCallingHandlers() और पुनःआरंभ
  4. stop() और warning() से मजबूत फ़ंक्शन लिखना
← R Academy पर वापस जाएँ