मैं इसे इस तरह करना चाहूंगा ताकि इसके प्रकार को foo()
बदलने की आवश्यकता न पड़े, इसे भी इसमें बदलना होगा bar()
।
def foo():
try:
raise IOError('Stuff')
except:
raise
def bar(arg1):
try:
foo()
except Exception as e:
raise type(e)(e.message + ' happens at %s' % arg1)
bar('arg1')
Traceback (most recent call last):
File "test.py", line 13, in <module>
bar('arg1')
File "test.py", line 11, in bar
raise type(e)(e.message + ' happens at %s' % arg1)
IOError: Stuff happens at arg1
अपडेट १
यहाँ एक मामूली संशोधन है जो मूल ट्रेसबैक को संरक्षित करता है:
...
def bar(arg1):
try:
foo()
except Exception as e:
import sys
raise type(e), type(e)(e.message +
' happens at %s' % arg1), sys.exc_info()[2]
bar('arg1')
Traceback (most recent call last):
File "test.py", line 16, in <module>
bar('arg1')
File "test.py", line 11, in bar
foo()
File "test.py", line 5, in foo
raise IOError('Stuff')
IOError: Stuff happens at arg1
अपडेट २
पायथन 3.x के लिए, मेरे पहले अपडेट में कोड वाक्य-रचना के गलत होने के साथ साथ एक होने का विचार है message
2012-05-16 को पीईपी 352 में एक बदलाव के लिए विशेषताBaseException
को वापस ले लिया गया था (मेरा पहला अपडेट 2012-03-12 को पोस्ट किया गया था) । तो वर्तमान में, Python 3.5.2 में, वैसे भी, आपको ट्रेसबैक को संरक्षित करने और फ़ंक्शन में अपवाद के प्रकार को हार्डकोड नहीं करने के लिए इन पंक्तियों के साथ कुछ करने की आवश्यकता होगी bar()
। यह भी ध्यान दें कि लाइन होगी:
During handling of the above exception, another exception occurred:
प्रदर्शित ट्रेसबैक संदेशों में।
# for Python 3.x
...
def bar(arg1):
try:
foo()
except Exception as e:
import sys
raise type(e)(str(e) +
' happens at %s' % arg1).with_traceback(sys.exc_info()[2])
bar('arg1')
अपडेट ३
एक टिप्पणीकार ने पूछा कि क्या कोई ऐसा तरीका है जो पायथन 2 और 3 में काम करेगा। हालाँकि, वाक्यविन्यास मतभेदों के कारण उत्तर "नहीं" प्रतीत हो सकता है, है की तरह एक सहायक फ़ंक्शन का उपयोग करके कि चारों ओर एक रास्ता reraise()
मेंsix
add- मॉड्यूल पर। इसलिए, यदि आप किसी कारण से लाइब्रेरी का उपयोग नहीं करेंगे, तो नीचे एक सरल स्टैंडअलोन संस्करण है।
यह भी ध्यान दें, कि चूंकि reraise()
फ़ंक्शन के भीतर अपवाद को अपवादित किया गया है, इसलिए जो भी ट्रेसबैक उठाया जाता है, उसमें दिखाई देगा, लेकिन अंतिम परिणाम वही है जो हम चाहते हैं।
import sys
if sys.version_info.major < 3: # Python 2?
# Using exec avoids a SyntaxError in Python 3.
exec("""def reraise(exc_type, exc_value, exc_traceback=None):
raise exc_type, exc_value, exc_traceback""")
else:
def reraise(exc_type, exc_value, exc_traceback=None):
if exc_value is None:
exc_value = exc_type()
if exc_value.__traceback__ is not exc_traceback:
raise exc_value.with_traceback(exc_traceback)
raise exc_value
def foo():
try:
raise IOError('Stuff')
except:
raise
def bar(arg1):
try:
foo()
except Exception as e:
reraise(type(e), type(e)(str(e) +
' happens at %s' % arg1), sys.exc_info()[2])
bar('arg1')
message
विशेषता के लिए दस्तावेज़ीकरण की तलाश करते हुए मुझे यह SO प्रश्न मिला, BaseException.message को Python 2.6 में पदावनत किया गया , जो यह दर्शाता है कि इसका उपयोग अब हतोत्साहित किया गया है (और यह डॉक्स में क्यों नहीं है)।