जवाबों:
पायथन 2.6 और बाद में और पायथन 3.x:
except Exception as e: print(e)
पायथन 2.5 और उससे पहले के लिए, उपयोग करें:
except Exception,e: print str(e)
str( KeyError('bad'))
=> 'bad'
- अपवाद प्रकार नहीं बताता है
print(repr(e))
; आधार Exception.__str__
कार्यान्वयन केवल अपवाद संदेश देता है, न कि प्रकार। या, traceback
मॉड्यूल का उपयोग करें , जिसमें वर्तमान अपवाद को मुद्रित करने के लिए विधियां हैं, स्वरूपित, या पूर्ण ट्रेसबैक।
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
error_message = traceback.format_exc()
except Exception as ex:
...
sys.exc_info()
फ़ंक्शन के माध्यम से उपलब्ध है और traceback.print_exc()
फ़ंक्शन इसे वहां से प्राप्त करता है। जब आप अपवाद को नहीं देखते हैं या आपको एक अलग अपवाद के आधार पर जानकारी दिखाना चाहते हैं, तो आपको केवल एक अपवाद को स्पष्ट रूप से पारित करने की आवश्यकता होगी।
में अजगर 2.6 या अधिक से अधिक यह थोड़ा क्लीनर है:
except Exception as e: print(e)
पुराने संस्करणों में यह अभी भी काफी पठनीय है:
except Exception, e: print e
यदि आप त्रुटि स्ट्रिंग पास करना चाहते हैं, तो यहां त्रुटियां और अपवाद (पायथन 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
(मैं @ 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
कैट प्लस प्लस के उत्तर के रूप में मॉड्यूल का उपयोग नहीं किया है , और शायद यही सबसे अच्छा तरीका है, लेकिन मैंने सोचा कि मैं इसे वहां फेंक दूंगा।
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)
अपवादों को पकड़ने के दौरान ट्रेसबैक से प्रदर्शित / लॉग इन की जाने वाली जानकारी पर बहुत अधिक नियंत्रण होता है।
कोड
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'