2017-02-28 5 views
9

बनाता है मैं आगे नदी के ऊपर इसे संभाल करने में सक्षम होना एक त्रुटि के लिए एक चेतावनी बदलने की आवश्यकता (चेतावनी बीच, जिस पर मैं कोई नियंत्रण नहीं में कहीं निगल रहे हैं; त्रुटियां नहीं हैं) । ऐसा करने के लिए, मैं कर रहा हूँ निम्नलिखित:`` tryCatch` अंदर withCallingHandlers` uncatchable त्रुटि

warning_to_error = function (expr) 
    withCallingHandlers(expr, warning = stop) 

यह महान काम करता है:

> warning_to_error(warning('foobar')) 
Error in withCallingHandlers(expr, warning = stop) : foobar 

दुर्भाग्य से, इस त्रुटि पूरी तरह से बनाता है uncatchable:

> try(warning_to_error(warning('foobar'))) 
Error in withCallingHandlers(expr, warning = stop) : foobar 

In my real situation, वहाँ मेरे warning_to_error और try के बीच कई परतें हैं (जिसमें तर्क है कि muffl ई चेतावनियां)। मैं अपने कॉलिंग हैंडलर को पकड़ने में त्रुटि कैसे उठा सकता हूं? दुर्भाग्य से मैं in another Stack Overflow question वर्णित पुनरारंभ का उपयोग नहीं कर सकता क्योंकि stop पुनरारंभ को परिभाषित नहीं करता है, और फिर भी मुझे फिर से पकड़ने वाले कोड पर कोई नियंत्रण नहीं होता है।

उत्तर

7

यह आपको बताना चाहिए क्या warning_to_error की अपनी परिभाषा के साथ क्या हो रहा है:

> tryCatch(warning_to_error(warning('foobar')), condition = print) 
<simpleWarning in withCallingHandlers(expr, warning = stop): foobar>``` 

रूप stop के लिए दस्तावेज़ कहते हैं, जब आप एक शर्त के साथ stop कहते हैं, उस स्थिति हैंडलर को ढूंढने के संकेत है, जिसका अर्थ इस मामले में warning हैंडलर। यदि आप एक त्रुटि हैंडलर को बुलाया जाना चाहते हैं तो आपको एक त्रुटि स्थिति सिग्नल करने की आवश्यकता है। ऐसा तब होता है जब आप उदाहरण के लिए options(warn = 2) सेट करते हैं। तो तुम

warning_to_error1 <- function (expr) 
    withCallingHandlers(expr, 
         warning = function(w) 
          stop("(converted from warning) ", 
           conditionMessage(w))) 

की तरह कुछ है कि आप

> tryCatch(warning_to_error1(warning('foobar')), 
+   error = function(e) print("Got it")) 
[1] "Got it" 

आदर्श रूप में देता है हम चेतावनी त्रुटियों के लिए परिवर्तित कर के लिए एक शर्त वर्ग और निर्माता प्रदान करते हैं और उपयोग करें कि आंतरिक रूप से के लिए warn = 2

+0

धन्यवाद, इस परिपूर्ण बनाता है चाहिए की जरूरत है समझ। मैंने वास्तव में ऐसा करने का प्रयास किया (= प्रिंटिंग/स्थिति का निरीक्षण करने के लिए स्थिति को वापस कर रहा है) लेकिन मेरे प्रयास विफल हो गए क्योंकि यह मेरे लिए ऐसा नहीं हुआ कि वर्ग 'त्रुटि' के अलावा कुछ भी होगा। ओह। –

+0

अगर मैं कॉल स्टैक जानकारी को किसी भी तरह से खराब कर सकता हूं तो यह और भी बड़ा होगा। दुर्भाग्यवश मैं 'eval' का उपयोग करते समय भी इसे प्राप्त करने में असमर्थ हूं, 'warn_to_error' के' parent.frame() 'में निष्पादित किया गया है: स्टैक ट्रेस हमेशा' eval' में समाप्त होता है। मुझे लगता है कि यह संभव नहीं है? –

+1

एक त्रुटि स्थिति ऑब्जेक्ट बनाएं और इसे 'sys.calls' के परिणाम को' स्टॉप 'पर पास करने से पहले संग्रहीत करें। –

संबंधित मुद्दे