जवाबों:
उपयोग str
try:
some_method()
except Exception as e:
s = str(e)
इसके अलावा, अधिकांश अपवाद वर्गों में एक args
विशेषता होगी । अक्सर, args[0]
एक त्रुटि संदेश होगा।
यह ध्यान दिया जाना चाहिए कि str
यदि कोई त्रुटि संदेश नहीं है, तो बस खाली स्ट्रिंग repr
लौटाएगा, जबकि pyfunc अनुशंसाओं का उपयोग करते हुए कम से कम अपवाद की श्रेणी प्रदर्शित होगी। मेरा लेना यह है कि यदि आप इसे प्रिंट कर रहे हैं, तो यह एक अंतिम उपयोगकर्ता के लिए है जो परवाह नहीं करता है कि कक्षा क्या है और बस एक त्रुटि संदेश चाहता है।
यह वास्तव में अपवाद के वर्ग पर निर्भर करता है कि आप किसके साथ व्यवहार कर रहे हैं और यह कैसे त्वरित है। क्या आपके मन में कुछ खास है?
e.message
क्योंकि मैं उपयोग करना पसंद करूंगा args[0]
।
raise Exception(u'jörn')
:। विफलता विशेष रूप से खराब है, क्योंकि आप वास्तविक अपवाद कभी नहीं देखेंगे, लेकिन सिर्फ एक UnicodeDecodeError
। यदि आपको अपवाद की एन्कोडिंग नहीं पता है (और अधिकांश समय जो आप नहीं करते हैं), तो आपको या तो काम करना चाहिए repr(e)
या यदि आपको वास्तव में करने की आवश्यकता है, तो अपने अपवाद से निपटने में एक और कोशिश को छोड़कर ब्लॉक का उपयोग करें जो कि यूनिकोडडबलऑर्डर को पकड़ता है और वापस आता है repr(e)
।
str
(या यहां तक कि unicode
या .format
) यूनिकोड से निपटने की वजह से कीड़े का कारण है। यदि आपके पास त्रुटि संदेश सामग्री का पूर्ण नियंत्रण नहीं है, तो repr
अप्रत्याशित यूनिकोड त्रुटियों से बचने के लिए ALWAYS का उपयोग करें।
Repr () का उपयोग करें और repr और str का उपयोग करने के बीच का अंतर
का उपयोग कर repr
:
>>> try:
... print(x)
... except Exception as e:
... print(repr(e))
...
NameError("name 'x' is not defined")
का उपयोग कर str
:
>>> try:
... print(x)
... except Exception as e:
... print(str(e))
...
name 'x' is not defined
repr
उपयोगी धन्यवाद, यह कुछ और लगता है unicode
, str
, एन्कोडिंग, ... इनपुट के आधार पर एक अपवाद उठा सकती है। काफी उपयोगी नहीं है जब देखने के लिए अपवाद रखने की कोशिश कर रहा है, लेकिन फिर भी exception-safe
ऐसा लगता है
str()
, क्योंकि इसमें वास्तव में अपवाद का प्रकार शामिल है। साथ str()
मुझे मिल गया 'status'
है, जबकि साथ repr()
मुझे मिल गया KeyError('status')
और मैं की तरह था "aaaaah, अब मैं त्रुटि को समझें।"
हालांकि मुझे एहसास है कि यह एक पुराना सवाल है, मैं अपवादों के आउटपुट को संभालने के लिए traceback
मॉड्यूल का उपयोग करने का सुझाव देना चाहता हूं ।
traceback.print_exc()
मानक त्रुटि के लिए वर्तमान अपवाद को प्रिंट करने के लिए उपयोग करें , जैसे यह मुद्रित किया जाएगा यदि यह बिना जारी रहा, या traceback.format_exc()
स्ट्रिंग के समान आउटपुट प्राप्त करने के लिए। यदि आप आउटपुट को सीमित करना चाहते हैं, तो आप या तो उन कार्यों के लिए विभिन्न तर्कों को पास कर सकते हैं, या प्रिंटिंग को फ़ाइल जैसी ऑब्जेक्ट पर पुनर्निर्देशित कर सकते हैं।
दूसरा तरीका अभी तक नहीं दिया गया है:
try:
1/0
except Exception, e:
print e.message
आउटपुट:
integer division or modulo by zero
args[0]
वास्तव में एक संदेश नहीं हो सकता है।
str(e)
आसपास के उद्धरणों के साथ स्ट्रिंग को वापस कर सकते हैं और संभवत u
: यदि यूनिकोड प्रमुख हो तो:
'integer division or modulo by zero'
repr(e)
पूर्ण अपवाद प्रतिनिधित्व देता है जो कि शायद आप क्या चाहते हैं:
"ZeroDivisionError('integer division or modulo by zero',)"
संपादित करें
मेरी गलती !!! ऐसा लगता है कि अंत BaseException.message
से हटा दिया गया है2.6
, यह निश्चित रूप से लगता है कि अपवाद संदेश प्रदर्शित करने के लिए अभी भी एक मानकीकृत तरीका नहीं है। तो मुझे लगता है कि सबसे अच्छा के साथ सौदा करने के लिए है e.args
और str(e)
(और संभवतः अपनी आवश्यकताओं पर निर्भर करता है e.message
, तो lib प्रयोग कर रहे हैं कि तंत्र पर निर्भर है)।
उदाहरण के लिए, के साथ pygraphviz
, e.message
सही तरीके से अपवाद प्रदर्शित करने का एकमात्र तरीका है, का उपयोग करके str(e)
संदेश को चारों ओर से घेर लिया जाएगा u''
।
लेकिन MySQLdb
, संदेश को पुनः प्राप्त करने का उचित तरीका है e.args[1]
: e.message
खाली है, और str(e)
प्रदर्शित करेगा'(ERR_CODE, "ERR_MSG")'
Python2 के e.message
लिए, अपवाद संदेश प्राप्त करने के लिए उपयोग करना बेहतर है , यह संभव नहीं होगा UnicodeDecodeError
। लेकिन हाँ e.message
कुछ प्रकार के अपवादों के लिए खाली होगा OSError
, जैसे कि हम exc_info=True
त्रुटि को याद न करने के लिए अपने लॉगिंग फ़ंक्शन में जोड़ सकते हैं ।
Python3 के लिए, मुझे लगता है कि इसका उपयोग करना सुरक्षित है str(e)
।
त्रुटि संदेश का निरीक्षण करने और इसके साथ कुछ करने के लिए (पायथन 3 के साथ) ...
try:
some_method()
except Exception as e:
if {value} in e.args:
{do something}