पायथन में अपवाद मूल्य प्राप्त करना


239

अगर मेरे पास वह कोड है:

try:
    some_method()
except Exception, e:

मुझे यह अपवाद मान कैसे मिल सकता है (स्ट्रिंग प्रतिनिधित्व मेरा मतलब है)?

जवाबों:


323

उपयोग str

try:
    some_method()
except Exception as e:
    s = str(e)

इसके अलावा, अधिकांश अपवाद वर्गों में एक argsविशेषता होगी । अक्सर, args[0]एक त्रुटि संदेश होगा।

यह ध्यान दिया जाना चाहिए कि strयदि कोई त्रुटि संदेश नहीं है, तो बस खाली स्ट्रिंग reprलौटाएगा, जबकि pyfunc अनुशंसाओं का उपयोग करते हुए कम से कम अपवाद की श्रेणी प्रदर्शित होगी। मेरा लेना यह है कि यदि आप इसे प्रिंट कर रहे हैं, तो यह एक अंतिम उपयोगकर्ता के लिए है जो परवाह नहीं करता है कि कक्षा क्या है और बस एक त्रुटि संदेश चाहता है।

यह वास्तव में अपवाद के वर्ग पर निर्भर करता है कि आप किसके साथ व्यवहार कर रहे हैं और यह कैसे त्वरित है। क्या आपके मन में कुछ खास है?


मैं एक रिपोर्ट बनाने के लिए इसे प्रिंट कर रहा हूं, str (e) ठीक है मुझे लगता है। धन्यवाद एक बहुत
Frias

8
मैं वास्तव में एक संदेश नहीं हो सकता e.messageक्योंकि मैं उपयोग करना पसंद करूंगा args[0]
cedbeu

3
यदि आप पूर्ण अपवाद प्राप्त करना चाहते हैं तो repr (e) भी मददगार है (जैसे NameError ("वैश्विक नाम 'वैरिएबल' परिभाषित नहीं है")), "वैश्विक नाम 'वेरिएबल' को परिभाषित नहीं किया गया है" के बजाय
बेन मॉरिस

49
यह उत्तर खतरनाक है, क्योंकि यह इस तरह के यूनिकोड अपवादों के लिए विफल होगा raise Exception(u'jörn'):। विफलता विशेष रूप से खराब है, क्योंकि आप वास्तविक अपवाद कभी नहीं देखेंगे, लेकिन सिर्फ एक UnicodeDecodeError। यदि आपको अपवाद की एन्कोडिंग नहीं पता है (और अधिकांश समय जो आप नहीं करते हैं), तो आपको या तो काम करना चाहिए repr(e)या यदि आपको वास्तव में करने की आवश्यकता है, तो अपने अपवाद से निपटने में एक और कोशिश को छोड़कर ब्लॉक का उपयोग करें जो कि यूनिकोडडबलऑर्डर को पकड़ता है और वापस आता है repr(e)
जोर्न हीस

11
@ JörnHees से सहमत हैं। मैं बार है कि की संख्या की गणना नहीं कर सकते हैं str(या यहां तक कि unicodeया .format) यूनिकोड से निपटने की वजह से कीड़े का कारण है। यदि आपके पास त्रुटि संदेश सामग्री का पूर्ण नियंत्रण नहीं है, तो reprअप्रत्याशित यूनिकोड त्रुटियों से बचने के लिए ALWAYS का उपयोग करें।
केनी ट्रेटेक

186

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

2
आह, reprउपयोगी धन्यवाद, यह कुछ और लगता है unicode, str, एन्कोडिंग, ... इनपुट के आधार पर एक अपवाद उठा सकती है। काफी उपयोगी नहीं है जब देखने के लिए अपवाद रखने की कोशिश कर रहा है, लेकिन फिर भी exception-safeऐसा लगता है
डैश

2
यह किसी भी तरह के समाधानों की तुलना में बहुत बेहतर है str(), क्योंकि इसमें वास्तव में अपवाद का प्रकार शामिल है। साथ str()मुझे मिल गया 'status'है, जबकि साथ repr()मुझे मिल गया KeyError('status')और मैं की तरह था "aaaaah, अब मैं त्रुटि को समझें।"
jlh

27

हालांकि मुझे एहसास है कि यह एक पुराना सवाल है, मैं अपवादों के आउटपुट को संभालने के लिए tracebackमॉड्यूल का उपयोग करने का सुझाव देना चाहता हूं ।

traceback.print_exc()मानक त्रुटि के लिए वर्तमान अपवाद को प्रिंट करने के लिए उपयोग करें , जैसे यह मुद्रित किया जाएगा यदि यह बिना जारी रहा, या traceback.format_exc()स्ट्रिंग के समान आउटपुट प्राप्त करने के लिए। यदि आप आउटपुट को सीमित करना चाहते हैं, तो आप या तो उन कार्यों के लिए विभिन्न तर्कों को पास कर सकते हैं, या प्रिंटिंग को फ़ाइल जैसी ऑब्जेक्ट पर पुनर्निर्देशित कर सकते हैं।


23

दूसरा तरीका अभी तक नहीं दिया गया है:

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")'


0

Python2 के e.messageलिए, अपवाद संदेश प्राप्त करने के लिए उपयोग करना बेहतर है , यह संभव नहीं होगा UnicodeDecodeError। लेकिन हाँ e.messageकुछ प्रकार के अपवादों के लिए खाली होगा OSError, जैसे कि हम exc_info=Trueत्रुटि को याद न करने के लिए अपने लॉगिंग फ़ंक्शन में जोड़ सकते हैं ।
Python3 के लिए, मुझे लगता है कि इसका उपयोग करना सुरक्षित है str(e)


0

यदि आपको त्रुटि के प्रकार / उत्पत्ति का पता नहीं है, तो आप कोशिश कर सकते हैं:

import sys
try:
    doSomethingWrongHere()
except:
    print('Error: {}'.format(sys.exc_info()[0]))

लेकिन सचेत रहें, आपको pep8 चेतावनी मिलेगी:

[W] PEP 8 (E722): do not use bare except

0

त्रुटि संदेश का निरीक्षण करने और इसके साथ कुछ करने के लिए (पायथन 3 के साथ) ...

try:
    some_method()
except Exception as e:
    if {value} in e.args:
        {do something}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.