আমার ধারণা, স্থির টাইপিংয়ের নিয়মের অভাবে কোনও সমাধান কেবল অনর্থক হতে পারে।
আমি এমন কোনও সরঞ্জাম সম্পর্কে অবগত নই যা ব্যতিক্রমগুলি যাচাই করে তবে আপনি নিজের প্রয়োজনগুলির সাথে মিলিয়ে নিজের সরঞ্জামটি নিয়ে আসতে পারেন (স্থির বিশ্লেষণের সাথে কিছুটা খেলার ভাল সুযোগ)।
প্রথম প্রয়াস হিসাবে, আপনি এমন একটি ফাংশন লিখতে পারেন যা একটি এএসটি তৈরি করে, সমস্ত Raise
নোড সন্ধান করে এবং তারপরে ব্যতিক্রম উত্থাপনের সাধারণ প্যাটার্নগুলি সনাক্ত করার চেষ্টা করে (যেমন সরাসরি কোনও কনস্ট্রাক্টরকে কল করা)
x
নিম্নলিখিত প্রোগ্রাম হতে দিন :
x = '''\
if f(x):
raise IOError(errno.ENOENT, 'not found')
else:
e = g(x)
raise e
'''
compiler
প্যাকেজটি ব্যবহার করে এএসটি তৈরি করুন :
tree = compiler.parse(x)
তারপরে একটি Raise
দর্শনার্থী শ্রেণি নির্ধারণ করুন :
class RaiseVisitor(object):
def __init__(self):
self.nodes = []
def visitRaise(self, n):
self.nodes.append(n)
এবং এএসটি সংগ্রহকারী Raise
নোডগুলি হাঁটা :
v = RaiseVisitor()
compiler.walk(tree, v)
>>> print v.nodes
[
Raise(
CallFunc(
Name('IOError'),
[Getattr(Name('errno'), 'ENOENT'), Const('not found')],
None, None),
None, None),
Raise(Name('e'), None, None),
]
আপনি সংকলক প্রতীক টেবিলগুলি ব্যবহার করে প্রতীকগুলি সমাধান করে, ডেটা নির্ভরতা ইত্যাদি বিশ্লেষণ করে চালিয়ে যেতে পারেন বা আপনি কেবল অনুমান করতে পারেন, CallFunc(Name('IOError'), ...)
"অবশ্যই IOError
" উত্থাপনের অর্থ হওয়া উচিত ", যা দ্রুত ব্যবহারিক ফলাফলের জন্য বেশ ঠিক আছে :)
raise
স্ট্রিংগুলিতেও স্ট্রিং করতে পারেনBaseException
। সুতরাং আপনি যদি লাইব্রেরি কোডটিতে কল করছেন যা আপনার নিয়ন্ত্রণের বাইরে রয়েছে, এমনকিexcept Exception
এটি পর্যাপ্ত নয়, কারণ এটি স্ট্রিং ব্যতিক্রমগুলি ধরবে না। অন্যরা যেমন উল্লেখ করেছে, আপনি এখানে ভুল গাছটি ছাঁটাই করছেন।