আমি এটি এটির মতো করব যাতে এর ধরণের 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
আপডেট 1
এখানে একটি সামান্য পরিবর্তন রয়েছে যা মূল ট্রেসব্যাক সংরক্ষণ করে:
...
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
আপডেট 2
পাইথন ৩.x এর জন্য, আমার প্রথম আপডেটের কোডটি সিনট্যাক্টিক্যালি ভুল এবং একটি থাকার ধারণাটি message
উপর অ্যাট্রিবিউট BaseException
হয় PEP 352 করার জন্য একটি পরিবর্তন প্রত্যাহৃত 2012-05-16 উপর (আমার প্রথম আপডেট 2012-03-12 পোস্ট করা হয়েছে) । সুতরাং বর্তমানে পাইথন 3.5.৩.২ তে যাইহোক, আপনার ট্রেসব্যাক সংরক্ষণের জন্য এই লাইনগুলি বরাবর কিছু করতে হবে এবং ফাংশনে ব্যতিক্রমের ধরণের হার্ডকোডটি নয় 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')
আপডেট 3
একজন মন্তব্যকারী জিজ্ঞাসা করেছিলেন যে পাইথন 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
বৈশিষ্ট্যের জন্য ডকুমেন্টেশন সন্ধান করার সময় আমি এই এসও প্রশ্নটি পেয়েছি, বেসএক্সেপশন.ম্যাসেজ পাইথন ২.6 এ অবমূল্যায়িত হয়েছে , যা দেখে মনে হয় যে এর ব্যবহারটি এখন নিরুৎসাহিত করা হয়েছে (এবং কেন এটি ডক্সে নেই)।