Как попробовать что-то, а если не получится, попробовать что-то другое - PullRequest
0 голосов
/ 25 февраля 2019

Я пишу сценарий, в котором мне нужно попытаться применить несколько методов разбора к электронному письму.Так что, если первый получился успешным, нет необходимости пробовать другие.До сих пор у меня есть только 2 метода разбора, но возможно, что я добавлю еще много.Если возможно, я бы хотел воспроизвести что-то вроде случая переключения (которого нет в 2.7).Что лучше, чем я делаю?

try:
    found['PhishMe_Informations']=self.parse_phishme(message)

except MalformedPhishMeMailError as e:
    self.log.error(e[0])
    found['PhishMe_Informations']=e[1]
    found['PhishMe_Informations']['Malformed']=True

except Exception:
    try:
        found['Journaling_Informations']=self.parse_journaling(message)

    except MalformedRecordMessageError as e:
         self.log.error(e)

    except Exception:
        pass

1 Ответ

0 голосов
/ 25 февраля 2019

Вы можете попытаться построить иерархическое дерево функций и возможных исключений в декларативном режиме, а затем написать код, который его обрабатывает.В вашем случае использования это может быть:

{ 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)
...