Кажется, вы уже знаете, как работают исключения.
Лучшее, что нужно сделать в случае ошибки, - это 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'