আমার ধারণা, স্থির টাইপিংয়ের নিয়মের অভাবে কোনও সমাধান কেবল অনর্থক হতে পারে।
আমি এমন কোনও সরঞ্জাম সম্পর্কে অবগত নই যা ব্যতিক্রমগুলি যাচাই করে তবে আপনি নিজের প্রয়োজনগুলির সাথে মিলিয়ে নিজের সরঞ্জামটি নিয়ে আসতে পারেন (স্থির বিশ্লেষণের সাথে কিছুটা খেলার ভাল সুযোগ)।
প্রথম প্রয়াস হিসাবে, আপনি এমন একটি ফাংশন লিখতে পারেন যা একটি এএসটি তৈরি করে, সমস্ত 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এটি পর্যাপ্ত নয়, কারণ এটি স্ট্রিং ব্যতিক্রমগুলি ধরবে না। অন্যরা যেমন উল্লেখ করেছে, আপনি এখানে ভুল গাছটি ছাঁটাই করছেন।