मुझे लगता है कि स्थैतिक टाइपिंग नियमों की कमी के कारण एक समाधान केवल असंभव हो सकता है।
मुझे अपवादों की जाँच करने वाले कुछ उपकरण के बारे में पता नहीं है, लेकिन आप अपनी ज़रूरतों के अनुरूप अपने उपकरण के साथ आ सकते हैं (स्थैतिक विश्लेषण के साथ थोड़ा खेलने का अच्छा मौका)।
पहले प्रयास के रूप में, आप एक फ़ंक्शन लिख सकते हैं जो एक एएसटी का निर्माण करता है, सभी 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पर्याप्त नहीं है, क्योंकि यह स्ट्रिंग अपवादों को नहीं पकड़ेगा। जैसा कि दूसरों ने बताया है, आप यहाँ गलत पेड़ को भौंक रहे हैं।