এই প্রশ্নের উত্তরটি আপনি ব্যবহার করছেন পাইথনের সংস্করণে depends
পাইথন 3 এ
এটি সহজ: ব্যতিক্রমগুলি এমন কোনও __traceback__
বৈশিষ্ট্যে সজ্জিত হয় যা ট্রেসব্যাক ধারণ করে। এই বৈশিষ্ট্যটিও লিখনযোগ্য, এবং with_traceback
ব্যতিক্রম পদ্ধতিটি ব্যবহার করে সুবিধামত সেট করা যেতে পারে :
raise Exception("foo occurred").with_traceback(tracebackobj)
এই বৈশিষ্ট্যগুলি raise
নথির অংশ হিসাবে ন্যূনতমভাবে বর্ণিত হয়েছে ।
উত্তরের এই অংশটির সমস্ত ক্রেডিট ভেক্টরকে দেওয়া উচিত, যিনি প্রথমে এই তথ্য পোস্ট করেছিলেন । আমি এটিকে এখানে কেবল যুক্ত করছি কারণ এই উত্তরটি শীর্ষে আটকে গেছে এবং পাইথন 3 আরও সাধারণ হয়ে উঠছে।
পাইথন 2 এ
এটা বিরক্তিকর জটিল। ট্রেসব্যাকগুলির সাথে সমস্যাটি হ'ল তাদের স্ট্যাক ফ্রেমের সাথে উল্লেখ রয়েছে এবং স্ট্যাক ফ্রেমে ট্র্যাকব্যাকগুলির সাথে রেফারেন্স রয়েছে যা স্ট্যাক ফ্রেমের সাথে উল্লেখ রয়েছে ... আপনার ধারণা পাওয়া যায় get এটি আবর্জনা সংগ্রহকারীদের জন্য সমস্যা সৃষ্টি করে। ( প্রথমে এটি দেখানোর জন্য ইক্যামচারকে ধন্যবাদ ।)
এটি সমাধানের দুর্দান্ত উপায় হ'ল অধ্যায়টি ছাড়ার পরে সার্জিকভাবে চক্রটি ভেঙে দেওয়াexcept
, এটি পাইথন 3 যা করে। পাইথন 2 সলিউশনটি অনেক কৃপণকর: আপনাকে একটি অ্যাড-হক ফাংশন সরবরাহ করা হবে sys.exc_info()
, যা কেবল except
ক্লজের অভ্যন্তরে কাজ করে । এটি ব্যতিক্রম, ব্যতিক্রমের ধরন এবং বর্তমানে যে কোনও ব্যতিক্রম বর্তমানে পরিচালনা করা হচ্ছে তার জন্য ট্রেসব্যাক সমন্বিত একটি টুপল ফেরত দেয়।
সুতরাং আপনি যদি except
ক্লজের অভ্যন্তরে থাকেন sys.exc_info()
তবে traceback
মডিউলটির পাশাপাশি আউটপুটটি বিভিন্ন দরকারী জিনিসগুলি ব্যবহার করতে পারেন :
>>> import sys, traceback
>>> def raise_exception():
... try:
... raise Exception
... except Exception:
... ex_type, ex, tb = sys.exc_info()
... traceback.print_tb(tb)
... finally:
... del tb
...
>>> raise_exception()
File "<stdin>", line 3, in raise_exception
তবে আপনার সম্পাদনাটি ইঙ্গিত দিচ্ছে, আপনি ইতিমধ্যে হ্যান্ডেল করার পরেও যদি আপনার ব্যতিক্রমটি পরিচালনা না করা হত তবে ট্রেসব্যাকটি মুদ্রিত হওয়ার চেষ্টা করছেন। এটি অনেক কঠিন প্রশ্ন। দুর্ভাগ্যক্রমে, কোনও ব্যতিক্রম হ্যান্ডেল না করা অবস্থায় ফিরে আসে । অন্যান্য সম্পর্কিত বৈশিষ্ট্যগুলিও সাহায্য করে না। কোনও ব্যতিক্রম পরিচালনা করা হচ্ছে না যখন অবচয় এবং অপরিজ্ঞাত; নিখুঁত বলে মনে হচ্ছে তবে এটি কেবল ইন্টারেক্টিভ সেশনের সময় সংজ্ঞায়িত হবে বলে মনে হয়।sys.exc_info
(None, None, None)
sys
sys.exc_traceback
sys.last_traceback
যদি আপনি কীভাবে ব্যতিক্রমটি উত্থাপিত হয় তা নিয়ন্ত্রণ করতে পারেন তবে আপনি কিছু তথ্য সঞ্চয় করতে ব্যবহার করতে পারবেন inspect
এবং একটি কাস্টম ব্যতিক্রম । তবে আমি কীভাবে এটি কাজ করবে তা পুরোপুরি নিশ্চিত নই।
সত্য কথা বলতে, একটি ব্যতিক্রম ধরা এবং ফিরিয়ে দেওয়া এক ধরণের অস্বাভাবিক কাজ। এটি কোনও চিহ্ন হতে পারে যা আপনাকে যাইহোক রিফ্যাক্টর করতে হবে।