R [बंद] में अपवाद हैंडलिंग


97

क्या किसी के पास आर में अपवाद से निपटने के उदाहरण / ट्यूटोरियल हैं? आधिकारिक दस्तावेज बहुत ही महत्वपूर्ण है।


1
यह एक अच्छा उदाहरण भी है: stackoverflow.com/q/12193779/2026975
इमरिस

मुझे यह ब्लॉग पोस्ट काफी उपयोगी
लगी

जवाबों:


31

शेन के जवाब के अलावा अन्य स्टैकऑवरफ्लो चर्चाओं की ओर इशारा करते हुए, आप एक कोड खोज सुविधा की कोशिश कर सकते हैं। Google के कोड खोज को इंगित किया गया यह मूल उत्तर तब से बंद है, लेकिन आप कोशिश कर सकते हैं

सिर्फ रिकॉर्ड के लिए, वहाँ भी है tryलेकिन tryCatchबेहतर हो सकता है। मैंने Google कोड खोज में एक त्वरित गणना की कोशिश की, लेकिन इस क्रिया के लिए बहुत अधिक झूठी सकारात्मकताएं प्राप्त की हैं - फिर भी ऐसा लगता है tryCatchकि इसका अधिक व्यापक रूप से उपयोग किया जाता है।


हो सकता है कि इस उदाहरण में मदद कर सकता: http://stackoverflow.com/a/12195574/2026975
imriss

एक Github खोज शायद मृत लिंक के लिए एक सभ्य प्रतिस्थापन है।
ग्रेगर थॉमस

सभी लिंक टूट गए हैं।
Toros91

60

मूल रूप से आप tryCatch()फ़ंक्शन का उपयोग करना चाहते हैं । अधिक जानकारी के लिए मदद ("tryCatch") देखें।

यहां एक तुच्छ उदाहरण दिया गया है (ध्यान रखें कि आप जो कुछ भी त्रुटि के साथ कर सकते हैं):

vari <- 1
tryCatch(print("passes"), error = function(e) print(vari), finally=print("finished")) 
tryCatch(stop("fails"), error = function(e) print(vari), finally=print("finished")) 

इन संबंधित सवालों पर एक नजर:



8

फ़ंक्शन trycatch()काफी सीधे आगे है, और उस पर बहुत सारे अच्छे ट्यूटोरियल हैं। आर में से निपटने त्रुटि का एक उत्कृष्ट विवरण हैडली विकहैम की पुस्तक में पाया जा सकता है उन्नत आर , और क्या इस प्रकार एक है बहुत करने के लिए बुनियादी परिचय withCallingHandlers()और withRestarts()संभव के रूप में कुछ शब्द रूप में:

कहते हैं कि निम्न स्तर का प्रोग्रामर निरपेक्ष मान की गणना करने के लिए एक फ़ंक्शन लिखता है। वह निश्चित नहीं है कि इसकी गणना कैसे की जाए, लेकिन एक त्रुटि का निर्माण करने का तरीका जानता है और परिश्रमपूर्वक अपनी नैवेद्य प्रदान करता है:

low_level_ABS <- function(x){
    if(x<0){
        #construct an error
        negative_value_error <- structure(
                    # with class `negative_value`
                    class = c("negative_value","error", "condition"),
                    list(message = "Not Sure what to with a negative value",
                         call = sys.call(), 
                         # and include the offending parameter in the error object
                         x=x))
        # raise the error
        stop(negative_value_error)
    }
    cat("Returning from low_level_ABS()\n")
    return(x)
}

एक मध्य-स्तरीय प्रोग्रामर भी पूर्ण मान की गणना करने के लिए एक फ़ंक्शन लिखता है, जो कि अपूर्ण अपूर्ण low_level_ABSफ़ंक्शन का उपयोग करता है। वह जानता है कि निम्न स्तर कोड एक negative_value त्रुटि फेंकता है जब मूल्य xनकारात्मक होता है और समस्या का समाधान सुझाता है, एक की स्थापना करकेrestart जिसकी उपयोगकर्ताओं mid_level_ABSको उस तरीके को नियंत्रित करने की अनुमति मिलती है जिसमें त्रुटि mid_level_ABSसे (या नहीं) ठीक हो जाता है negative_value

mid_level_ABS <- function(y){
    abs_y <- withRestarts(low_level_ABS(y), 
                          # establish a restart called 'negative_value'
                          # which returns the negative of it's argument
                          negative_value_restart=function(z){-z}) 
    cat("Returning from mid_level_ABS()\n")
    return(abs_y)
}

अंत में, एक उच्च स्तरीय प्रोग्रामर का उपयोग करता है mid_level_ABS पूर्ण मान की गणना करने के फ़ंक्शन , और एक शर्त हैंडलर स्थापित करता है जो पुनरारंभ हैंडलर का उपयोग करके त्रुटि mid_level_ABSसे उबरने के लिए कहता है negative_value

high_level_ABS <- function(z){
    abs_z <- withCallingHandlers(
            # call this function
            mid_level_ABS(z) ,
            # and if an `error` occurres
            error = function(err){
                # and the `error` is a `negative_value` error
                if(inherits(err,"negative_value")){
                    # invoke the restart called 'negative_value_restart'
                    invokeRestart('negative_value_restart', 
                                     # and invoke it with this parameter
                                     err$x) 
                }else{
                    # otherwise re-raise the error
                    stop(err)
                }
            })
    cat("Returning from high_level_ABS()\n")
    return(abs_z)
}

इस सबका मुद्दा यह है कि उपयोग करके withRestarts()और withCallingHandlers(), फ़ंक्शन high_level_ABSयह बताने में सक्षम था कि mid_level_ABSकैसे उठाए गए त्रुटियों से उबरने के लिएlow_level_ABSmid_level_ABS जा सकता है, जिसके निष्पादन को रोकने के बिना त्रुटि है , जो कि आप के साथ नहीं कर सकते हैं tryCatch():

> high_level_ABS(3)
Returning from low_level_ABS()
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3
> high_level_ABS(-3)
Returning from mid_level_ABS()
Returning from high_level_ABS()
[1] 3

व्यवहार में, low_level_ABSएक फ़ंक्शन का प्रतिनिधित्व करता है जो mid_level_ABSबहुत कुछ कहता है (शायद लाखों बार भी), जिसके लिए त्रुटि से निपटने की सही विधि स्थिति से भिन्न हो सकती है, और विशिष्ट त्रुटियों को कैसे संभालना है इसका विकल्प उच्च स्तर के कार्यों ( high_level_ABS) में छोड़ दिया गया है ।


7

रिस्टार्ट फंक्शन Lisp से विरासत में मिले R में बहुत महत्वपूर्ण है। यह उपयोगी है यदि आप लूप बॉडी में कुछ फ़ंक्शन को कॉल करना चाहते हैं और आप केवल प्रोग्राम को जारी रखना चाहते हैं यदि फ़ंक्शन कॉल गिर जाता है। इस कोड को आज़माएं:

for (i in 1:20) withRestarts(tryCatch(
if((a <- runif(1))>0.5) print(a) else stop(a),
finally = print("loop body finished!")), 
abort = function(){})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.