कार्यक्रम को बाधित किए बिना पायथन में चेतावनी उठाएं


189

मैं प्रोग्राम को क्रैश / स्टॉप / इंटरप्ट किए बिना पायथन में चेतावनी को बढ़ाने की कोशिश कर रहा हूं।

मैं यह जांचने के लिए निम्नलिखित सरल फ़ंक्शन का उपयोग करता हूं कि क्या उपयोगकर्ता ने इसे एक गैर-शून्य नंबर दिया है। यदि हां, तो कार्यक्रम को उन्हें चेतावनी देनी चाहिए, लेकिन सामान्य रूप से जारी रखें। यह नीचे दिए गए कोड की तरह काम करना चाहिए, लेकिन वर्ग का उपयोग करना चाहिए Warning(), Error()या Exception()चेतावनी को मैन्युअल रूप से प्रिंट करने के बजाय।

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     print "WARNING: the input is 0!"
   return i

यदि मैं नीचे दिए गए कोड का उपयोग करता हूं और फ़ंक्शन को 0 पास करता हूं, तो प्रोग्राम क्रैश हो जाता है और मान कभी वापस नहीं आता है। इसके बजाय, मैं चाहता हूं कि कार्यक्रम सामान्य रूप से जारी रहे और बस उपयोगकर्ता को सूचित करें कि वह फ़ंक्शन में 0 से गुजर चुका है।

def is_zero(i):
   if i != 0:
     print "OK"
   else:
     raise Warning("the input is 0!")
   return i

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


आप वास्तव में उपयोगकर्ता को कैसे सूचित करना चाहते हैं? ईमेल या एसएमएस के माध्यम से? कारण है कि ऊपर झुका जा सकता है, लेकिन आप विशिष्ट होना चाहिए।
एरोनस्टरलिंग 15

2
आप सिर्फ printसंदेश क्यों नहीं देते ?
sje397

1
@ sje397 बात यह है कि मैं यह परीक्षण करने में सक्षम होना चाहता हूं कि एक चेतावनी को एकतरफा परीक्षण करके फेंक दिया गया है। यदि मैं केवल संदेश को प्रिंट कर लेता हूं, तो मैं ऐसा नहीं कर पा रहा हूं, क्योंकि यह सबसे महत्वपूर्ण है।
टॉमस नोवोटनी

जवाबों:


157

आपको raiseचेतावनी नहीं देनी चाहिए , आपको warningsमॉड्यूल का उपयोग करना चाहिए । इसे बढ़ाकर आप चेतावनी के बजाय त्रुटि उत्पन्न कर रहे हैं।


1
आपका बहुत बहुत धन्यवाद। और फिर मैं यह कैसे परीक्षण करूं कि चेतावनी को एकमत का उपयोग करके फेंक दिया गया है? मैं अब और नहीं () का उपयोग नहीं कर सकता।
टॉमस नोवोटनी

@ टोमास नोवोत्नी आप स्टडआउट और स्टडर को पकड़ सकते हैं, फिर जांच लें कि आपकी चेतावनी द्वारा जारी किए गए तार भीतर पाए गए हैं।
गेहूं

15
@ टोमास: मैंने चेतावनी के लिए परीक्षण करने की इच्छा के बारे में कभी नहीं सुना, लेकिन एक warnings.catch_warningsसंदर्भ प्रबंधक उपलब्ध है जो आपको ऐसा करने देगा।
साइलेंटगॉस्ट

290
import warnings
warnings.warn("Warning...........Message")

अजगर प्रलेखन देखें: यहाँ


6
और warnings.warn("blabla", DeprecationWarning)इस तरह की चेतावनी जारी करने के लिए एक वर्ग जोड़ने के लिए
shadi

52

डिफ़ॉल्ट रूप से, एक अपवाद के विपरीत, एक चेतावनी बाधित नहीं होती है।

चेतावनीimport warnings देने के बाद , चेतावनी वर्ग निर्दिष्ट करना संभव है । यदि कोई निर्दिष्ट नहीं है, तो यह वस्तुतः UserWarningडिफ़ॉल्ट रूप से है।

>>> warnings.warn('This is a default warning.')
<string>:1: UserWarning: This is a default warning.

इसके बजाय केवल एक पूर्ववर्ती कक्षा का उपयोग करने के लिए, जैसे DeprecationWarning:

>>> warnings.warn('This is a particular warning.', DeprecationWarning)
<string>:1: DeprecationWarning: This is a particular warning.

एक कस्टम चेतावनी वर्ग बनाना एक कस्टम अपवाद वर्ग बनाने के समान है:

>>> class MyCustomWarning(UserWarning):
...     pass
... 
... warnings.warn('This is my custom warning.', MyCustomWarning)

<string>:1: MyCustomWarning: This is my custom warning.

परीक्षण के लिए, विचार करें assertWarnsया assertWarnsRegex


एक विकल्प के रूप में, विशेष रूप से स्टैंडअलोन अनुप्रयोगों के लिए, loggingमॉड्यूल पर विचार करें । यह डिबग , सूचना , चेतावनी , त्रुटि आदि के स्तर वाले संदेशों को लॉग कर सकता है। चेतावनी के स्तर वाले संदेश लॉग करें या उच्चतर डिफ़ॉल्ट रूप से stderr पर मुद्रित होते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.