Почему я должен переделывать оператор try-exc при вызове функции, которая делает это точно? - PullRequest
1 голос
/ 17 марта 2020

У меня следующая проблема: я указал метод для данного класса, который обрабатывает две разные ошибки с одним и тем же определяемым пользователем исключением (см. Метод ниже).

def get_route(self, source, target):

    try:
        n = nx.shortest_path(self.graph, source, target)
        return n

    except (nx.NetworkXNoPath, nx.NodeNotFound):
        raise NoSuchFlight

Итак, теперь я хочу далее определить функцию, которая вызывает вышеуказанный метод. Я заметил, что код работает, когда я повторяю оператор try-exc, который я не совсем понимаю (см. Ниже).

def get_airlines_per_route(airlines_dict, source, target, max_intermediate_stops):
    lst = []

    for airline in airlines_dict.values():

        try:
            path = airline.get_route(source, target)
            if (len(path) - 2) <= max_intermediate_stops:
                lst.append(airline)

        except:
            NoSuchFlight

    return lst

Однако я понятия не имею, почему это работает. В любом случае мой код правильный? И более того, как бы вы, ребята, решили эту проблему?

Спасибо за любой совет.

Обновление:

Определяемое пользователем исключение:

class NoSuchFlight(Exception):
    pass

Предполагаемый путь:

def get_airlines_per_route(airlines_dict, source, target, max_intermediate_stops):
    lst = []

    for airline in airlines_dict.values():

        path = airline.get_route(source, target)
        if (len(path) - 2) <= max_intermediate_stops:
            lst.append(airline)

    return lst

Ответы [ 2 ]

2 голосов
/ 17 марта 2020

второй try except поймает все Exceptions, поэтому ваш код работает, я предлагаю использовать:

try:
    path = airline.get_route(source, target)
    if (len(path) - 2) <= max_intermediate_stops:
        lst.append(airline)

except NoSuchFlight:
    # log or something else
1 голос
/ 17 марта 2020

Это работает, но у вас не должно быть такого кода.

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

except (nx.NetworkXNoPath, nx.NodeNotFound) as e:
    raise NoSuchFlight(e)

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

И следующая строка NoSuchFlight близка к запрету: она просто называет исключение. Вы можете попробовать набрать Exception в интерпретаторе python, и он просто отобразит имя класса:

>>> Exception
<class 'Exception'>

, не поднимая ничего ...

Если вы просто хотите игнорировать ошибочные маршруты, вы должны использовать:

def get_airlines_per_route(airlines_dict, source, target, max_intermediate_stops):
    lst = []

    for airline in airlines_dict.values():
       try:
           path = airline.get_route(source, target)
           if (len(path) - 2) <= max_intermediate_stops:
               lst.append(airline)
       catch  NoSuchFlight:          # just skip in case of a NoSuchFlight
           pass

    return lst
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...