Каков подходящий способ обработки исключений внутри метода python? - PullRequest
0 голосов
/ 30 апреля 2018

Предположим, у меня есть функция и, в зависимости от ее входов, она должна "сообщить" функции вызывающей стороны, что что-то пошло не так:

def get_task(msg, chat):
    task_id = int(msg)
    query = db.SESSION.query(Task).filter_by(id=task_id, chat=chat)
    try:
        task = query.one()
    except sqlalchemy.orm.exc.NoResultFound:
        return "_404_ error"
    return task

Обратите внимание, что в блоке исключений я хочу передать то, что может обработать вызывающая функция, и, если необходимо, остановить выполнение, в противном случае он вернет нужный объект.

def something_with_the_task(msg, chat):
   task = get_task(msg, chat)
   if task == "_404_ error":
       return
   #do some stuff with task

1 Ответ

0 голосов
/ 30 апреля 2018

Кажется, вы уже знаете, как работают исключения.

Лучшее, что нужно сделать в случае ошибки, - это raise исключение.

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

Вы можете просто позволить исключению sqlalchemy.orm.exc.NoResultFound исключить (удалив блок try: и except: в get_task()) и позволить вызывающей стороне обработать его с помощью блока try: ... except: ..., или, если вы предпочитаете чтобы сделать сокрытие , вы можете определить пользовательское исключение:

class YourException(Exception):
    pass

и используйте его так:

def get_task(msg, chat):
    try:
        task = ...
    except sqlalchemy.orm.exc.NoResultFound:
        raise YourException('explanation')
    return task

def something_with_the_task(msg, chat):
    try:
        task = get_task(msg, chat)
        # do some stuff with task
    except YourException as e:
        # do something with e
        # e.args[0] will contain 'explanation'

Не стесняйтесь сделать класс YourException более информативным, явно добавив некоторые атрибуты и конструктор для их установки, если это необходимо.

Конструктор по умолчанию делает достойную работу, однако:

>>> e = YourException('Program made a boo boo', 42, 'FATAL')
>>> e
YourException('Program made a boo boo', 42, 'FATAL')
>>> e.args[0]
'Program made a boo boo'
>>> e.args[1]
42
>>> e.args[2]
'FATAL'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...