Python: мне не разрешено поднимать исключения.Есть ли другие элегантные способы Python? - PullRequest
1 голос
/ 06 октября 2010

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

def f1()
 if bad_thing_happen():
   raise Exception('bad stuff')
 ...
 return something

Я мог бы изменить его на

def f1()
  if bad_thing_happen():
    return [-1, None]
  ...
  return [0, something]

f1 вызывающий абонент будет таким

def f1_caller():
  code, result = f1(param1)
  if code < 0:
    return code
  actual_work1()
  # call f1 again
  code, result = f1(param2)
  if code < 0:
    return code
  actual_work2()
  ...

Есть ли в Python более элегантные способы, чем этот?

Ответы [ 3 ]

3 голосов
/ 06 октября 2010

Исключения в python - это не то, чего следует избегать, и зачастую это прямой способ решения проблем.Кроме того, исключение содержит большое количество информации, которая может помочь быстро найти (через трассировку стека) и выявить проблемы (через класс исключений или сообщение).другого языка (возможно, C ++?), где создание исключений является более дорогой операцией (и снизит производительность, если ваш код выполняется на 20-летнем компьютере).

Чтобы ответить на ваш вопрос: альтернатива - вернуть код ошибки.Это означает, что вы смешиваете результаты функции с обработкой ошибок, что порождает (ха!) Свои собственные проблемы.Однако возврат None часто является вполне разумным способом указать на сбой функции.

1 голос
/ 06 октября 2010

Вы должны использовать коды возврата.Другие альтернативы могут включать изменяющееся глобальное состояние (например, C 'errno) или передачу изменяемого объекта (например, списка), но вы почти всегда хотите избегать обоих в Python.Возможно, вы могли бы попытаться объяснить им, как исключения позволяют писать лучшие пост-условия вместо добавления усложнения к возвращаемым значениям, но в остальном эквивалентны.

1 голос
/ 06 октября 2010

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

Другой возможный подход, если вы ожидаете вернуть список (или словарь и т. Д.), Этовернуть пустой список или дикт.Это легко проверить на использование if, потому что пустой контейнер оценивается в False в Python, и если вы собираетесь его перебирать, вам может даже не понадобиться проверять его (в зависимости от того, что вы хотите сделатьесли функция не работает).

Конечно, эти подходы не сообщают вам , почему функция не сработала.Таким образом, вы можете вернуть экземпляр исключения, например return ValueError("invalid index").Затем вы можете проверить определенные исключения (или исключения в целом), используя isinstance(), и распечатать их, чтобы получить достойные сообщения об ошибках.(Или вы можете предоставить вспомогательную функцию, которая проверяет код возврата, чтобы увидеть, является ли он производным от Exception.) Вы все еще можете создавать свои собственные подклассы Exception;вы бы просто возвращали их, а не поднимали.

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

...