पायथन में एक अपवाद कैसे प्रिंट करें?


723
try:
    something here
except:
    print('the whatever error occurred.')

मैं अपने except:ब्लॉक में त्रुटि / अपवाद को कैसे प्रिंट कर सकता हूं ?


जवाबों:


1061

पायथन 2.6 और बाद में और पायथन 3.x:

except Exception as e: print(e)

पायथन 2.5 और उससे पहले के लिए, उपयोग करें:

except Exception,e: print str(e)

41
str( KeyError('bad'))=> 'bad'- अपवाद प्रकार नहीं बताता है
डेव

10
की-ऑपरेटर्स पर प्रिंट (e) केवल कुंजी देता है, लेकिन पूर्ण अपवाद संदेश नहीं, जो सहायक से कम है।
13

14
यदि आप अपवाद को मुद्रित करने जा रहे हैं, तो इसका उपयोग करना बेहतर है print(repr(e)); आधार Exception.__str__कार्यान्वयन केवल अपवाद संदेश देता है, न कि प्रकार। या, tracebackमॉड्यूल का उपयोग करें , जिसमें वर्तमान अपवाद को मुद्रित करने के लिए विधियां हैं, स्वरूपित, या पूर्ण ट्रेसबैक।
मार्टिन पीटर्स

450

tracebackमॉड्यूल के लिए तरीके प्रदान स्वरूपण और मुद्रण अपवाद और उनके ट्रेस बैक, इस जैसे अपवाद प्रिंट होगा डिफ़ॉल्ट प्रबंधक की तरह कार्य करता है:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

आउटपुट:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero

3
क्या किसी प्रकार की get_error_message कॉल है जिसे मैं देखने के साथ प्रिंट कर सकता हूं क्योंकि मैं कुछ अन्य चीजों को जोड़ने के लिए अपनी खुद की प्रिंटिंग दिनचर्या का उपयोग कर रहा हूं।
23

10
@ मायकेशेम error_message = traceback.format_exc()
हेयलिंग

3
धन्यवाद, यह वही है जो मैं चाहता था। पूरे निशान, न केवल त्रुटि प्रकार और संदेश
केन बेलोज़

यह स्निप कैप्चर की गई अपवाद ऑब्जेक्ट का उपयोग नहीं करता है। क्या आप 'पूर्व' का उपयोग करने के लिए कोड का विस्तार कर सकते हैं? - यथा except Exception as ex:...
aaronsteers

@ARonsteers यह कैप्चर किए गए अपवाद का उपयोग करता है; एक अपवाद हैंडलर में वर्तमान अपवाद sys.exc_info()फ़ंक्शन के माध्यम से उपलब्ध है और traceback.print_exc()फ़ंक्शन इसे वहां से प्राप्त करता है। जब आप अपवाद को नहीं देखते हैं या आपको एक अलग अपवाद के आधार पर जानकारी दिखाना चाहते हैं, तो आपको केवल एक अपवाद को स्पष्ट रूप से पारित करने की आवश्यकता होगी।
मार्टिन पीटर्स

169

में अजगर 2.6 या अधिक से अधिक यह थोड़ा क्लीनर है:

except Exception as e: print(e)

पुराने संस्करणों में यह अभी भी काफी पठनीय है:

except Exception, e: print e

15
Python3 में, "के रूप में" के साथ, 1 तरह का उपयोग करना चाहिए।
सैम वाटकिंस

53

यदि आप त्रुटि स्ट्रिंग पास करना चाहते हैं, तो यहां त्रुटियां और अपवाद (पायथन 2.6) से एक उदाहरण है

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

38

(मैं @ jldupont के उत्तर पर एक टिप्पणी के रूप में इसे छोड़ने जा रहा था, लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है।)

मैंने अन्य स्थानों में भी @ jldupont के उत्तर जैसे उत्तर देखे हैं। FWIW, मुझे लगता है कि यह नोट करना महत्वपूर्ण है:

except Exception as e:
    print(e)

sys.stdoutडिफ़ॉल्ट रूप से त्रुटि आउटपुट प्रिंट करेगा । सामान्य रूप से त्रुटि से निपटने का एक अधिक उपयुक्त तरीका होगा:

except Exception as e:
    print(e, file=sys.stderr)

(ध्यान दें कि आपको import sysकाम करने के लिए यह करना होगा।) इस तरह, STDERRइसके बजाय त्रुटि को मुद्रित किया जाता है STDOUT, जो उचित आउटपुट पार्सिंग / रीडायरेक्शन / आदि के लिए अनुमति देता है। मैं समझता हूं कि यह प्रश्न 'प्रिंटिंग ए एरर' के बारे में कड़ाई से था, लेकिन इस विवरण को छोड़ने के बजाय यहां सर्वोत्तम अभ्यास को इंगित करना महत्वपूर्ण है, जो कि उन लोगों के लिए गैर-मानक कोड हो सकता है जो अंततः बेहतर नहीं सीखते हैं।

मैंने tracebackकैट प्लस प्लस के उत्तर के रूप में मॉड्यूल का उपयोग नहीं किया है , और शायद यही सबसे अच्छा तरीका है, लेकिन मैंने सोचा कि मैं इसे वहां फेंक दूंगा।


1
मैं आगे फ्लश = सच जोड़ने का सुझाव दूंगा। मैंने सिस्टमड के साथ ध्यान दिया है (और एक उचित लॉगिंग फ्रेमवर्क का उपयोग नहीं कर रहा है), उस बफ़रिंग को जब पत्रिका पर कब्जा करना है, तो वह नहीं है जो मैंने उम्मीद की थी।
कैमरून केर

20

अजगर 3: logging

मूल print()फ़ंक्शन का उपयोग करने के बजाय , loggingअपवाद को लॉग करने के लिए अधिक लचीले मॉड्यूल का उपयोग किया जा सकता है। loggingमॉड्यूल प्रदान करता है एक बहुत अतिरिक्त कार्यक्षमता, एक दिया लॉग फ़ाइल में जैसे लॉगिंग संदेशों, timestamps और के बारे में जहां प्रवेश हुआ अतिरिक्त जानकारी के साथ संदेशों प्रवेश करने। (अधिक जानकारी के लिए आधिकारिक दस्तावेज देखें ।)

एक अपवाद लॉगिंग मॉड्यूल-स्तरीय फ़ंक्शन के साथ किया जा सकता है logging.exception()जैसे:

import logging

try:
    1/0
except BaseException:
    logging.exception("An exception was thrown!")

आउटपुट:

ERROR:root:An exception was thrown!
Traceback (most recent call last):
  File ".../Desktop/test.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero 

टिप्पणियाँ:

  • फ़ंक्शन logging.exception()को केवल अपवाद हैंडलर से बुलाया जाना चाहिए

  • loggingमॉड्यूल एक प्रवेश हैंडलर के अंदर इस्तेमाल किया जा नहीं करना चाहिए एक से बचने के लिए RecursionError(धन्यवाद @PrakharPandey)


वैकल्पिक लॉग-स्तर

कीवर्ड तर्क का उपयोग करके किसी अन्य लॉग-स्तर के साथ अपवाद को लॉग करना संभव है exc_info=True:

logging.debug("An exception was thrown!", exc_info=True)
logging.info("An exception was thrown!", exc_info=True)
logging.warning("An exception was thrown!", exc_info=True)

1
RecursionError से बचने के लिए एक लॉगिंग हैंडलर के अंदर इस्तेमाल नहीं किया जाना चाहिए
प्रखर पांडे

4

यदि आप करना चाहते हैं तो एक लाइनर त्रुटि को मुखर बयानों के साथ किया जा सकता है। यह आपको स्टेटिक रूप से फिक्स्ड कोड लिखने और त्रुटियों को जल्द जांचने में मदद करेगा।

assert type(A) is type(""), "requires a string"

2

अपवादों को पकड़ने के दौरान ट्रेसबैक से प्रदर्शित / लॉग इन की जाने वाली जानकारी पर बहुत अधिक नियंत्रण होता है।

कोड

with open("not_existing_file.txt", 'r') as text:
    pass

निम्नलिखित ट्रेसबैक का उत्पादन करेगा:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

पूरा ट्रेसबैक प्रिंट / लॉग करें

जैसा कि दूसरों ने पहले ही उल्लेख किया है, आप ट्रेसबैक मॉड्यूल का उपयोग करके पूरे ट्रेसबैक को पकड़ सकते हैं:

import traceback
try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    traceback.print_exc()

यह निम्नलिखित उत्पादन का उत्पादन करेगा:

Traceback (most recent call last):
  File "exception_checks.py", line 19, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

आप लॉगिंग का उपयोग करके इसे प्राप्त कर सकते हैं:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    logger.error(exception, exc_info=True)

आउटपुट:

__main__: 2020-05-27 12:10:47-ERROR- [Errno 2] No such file or directory: 'not_existing_file.txt'
Traceback (most recent call last):
  File "exception_checks.py", line 27, in <module>
    with open("not_existing_file.txt", 'r') as text:
FileNotFoundError: [Errno 2] No such file or directory: 'not_existing_file.txt'

केवल त्रुटि नाम / संदेश प्रिंट / लॉग करें

आपको संपूर्ण ट्रेसबैक में दिलचस्पी नहीं हो सकती है, लेकिन केवल सबसे महत्वपूर्ण जानकारी में, जैसे अपवाद नाम और अपवाद संदेश, उपयोग:

try:
    with open("not_existing_file.txt", 'r') as text:
        pass
except Exception as exception:
    print("Exception: {}".format(type(exception).__name__))
    print("Exception message: {}".format(exception))

आउटपुट:

Exception: FileNotFoundError
Exception message: [Errno 2] No such file or directory: 'not_existing_file.txt'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.