Попробуй Refactor и кроме кодовых блоков в Python - PullRequest
0 голосов
/ 19 февраля 2020

В настоящее время мое приложение работает с несколькими внешними API, и эти функции могут вызывать какие-то ошибки, и я хотел бы знать обо всех ситуациях и не создавать sh мое приложение. В следующем фрагменте кода вы можете увидеть мою функцию, используя slack api (это просто пример, а не реальный пример), и вы можете увидеть, как я создаю пробел с именем и адресами электронной почты. Эта функция может возвращать несколько ошибок, таких как APIerror, TypeError ... et c et c

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

slack_client.py


def create_space():
  try:
    slack_api.create.space(spaceName='space name', email=emails)
  except (...):
    ...
def delete_space():
  try:
    slack_api.delete.space(spaceId=space_id)
  except (...):
    ...

Я хотел бы изменить рефакторинг, за исключением части, потому что Я не хочу копировать и вставлять попытку, кроме как во время всего моего класса slack_client, но в случае, если соединение не работает или какой-то параметр wron, API "Slack" выдаст мне ошибку.

I Мысль о создании класса, для запуска каждой функции внутри try и catch, но это немного странно, и я потеряю часть аргументов, например "spaceName = 'space name'", что, я думаю, действительно круто и понятно.


def execute_func(func, *args):
  try:
     func(args)
  except (..):
     ...

Поэтому хотелось бы некоторой помощи для такого рода ситуаций, потому что обрабатывать внешний API не всегда очень просто ... (на данный момент работа с 2 внешними API)

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

В прошлой жизни я использовал VAX / VMS и до сих пор помню огромное удовольствие от обнаружения LIB $ SIG_TO_RET, который преобразовывал сигнал в возвращаемое значение. Вы можете сделать то же самое в нескольких строках Python, по указанным вами линиям

def execute_func(func, *args, **kwargs):
  try:
     result = func( *args, **kwargs)
     return (True, result)

  except Exception as exc:
       return ( False, exc)

Использование

result = execute_func( func, a1, a2, ... k1=v1, k2=v2, ...)
if  result[0]:
    func_result = result[1] # if it's  useful
    ...
else:
     # it went wrong, deal with the exception
     caught_exception = result[1]
     print( caught_exception)
0 голосов
/ 19 февраля 2020

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

Сначала создайте свое исключение:

class CustomSlackException(Exception):
    pass

Затем вызовите его, когда вызванный вами API выдает какое-то исключение:

try:
    slack_api.create.space(spaceName='space name', email=emails)
except Exception as e:
    print(e)
    raise CustomSlackException("Custom error message!")

Теперь вы можете поймайте свое исключение и обработайте его по мере необходимости.

...