Вы можете попытаться построить иерархическое дерево функций и возможных исключений в декларативном режиме, а затем написать код, который его обрабатывает.В вашем случае использования это может быть:
{ cls.parse_phishme: OrderedDict(
(MalformedPhishMeMailError, cls.process_malformed),
(Exception, { cls.parse_journaling: OrderedDict(
(MalformedRecordMessageError, cls.log_err),
(Exception, None)
)
)
}
Метод обработки этого дерева может быть:
def process_exc_tree(self, d, message):
if isinstance(d, dict): # is d a (possibly ordered) dict?
for func, exc in d.items():
try:
self.func(message) # call the function passed as key
except Exception as e: # process the exceptions
for ex, suite in exc.items(): # passed as ordered dict
if isinstance(e, ex):
# Ok found the relevant exception: recurse
self.process_exc_tree(suite, message)
elif d is None: # if d is None, do nothing
pass
else: # it should be a function: call it
self.d(message)