Где стандартный список исключений Python для программ для поднятия? - PullRequest
17 голосов
/ 04 ноября 2010

Существует список стандартных исключений Python , которые мы должны остерегаться, но я не думаю, что это те, которые мы должны поднимать сами, потому что они редко применимы.

Мне любопытно, если в стандартной библиотеке Python существует список, с исключениями, подобными ApplicationException , ArgumentNullException , ArgumentOutOfRangeException , InvalidOperationException - исключения, которые мы можем поднять сами?

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

РЕДАКТИРОВАТЬ: Я не спрашиваю о том, как обрабатывать исключения, но какие типы я могу и должен вызывать при необходимости.

Ответы [ 4 ]

14 голосов
/ 04 ноября 2010

Если ошибка соответствует описанию одного из стандартных классов исключений Python, то непременно выкините ее.

Обычно используются TypeError и ValueError, список, к которому вы уже привязали, является стандартным списком.

Если вы хотите иметь специфичные для приложения, тогда подклассификация Exception или одного из его потомков - путь.

Для ссылки на примеры, которые вы привели из .NET ApplicationException ближе всего к RuntimeError ArgumentNullException, вероятно, будет AttributeError (попробуйте вызвать метод, который вы хотите, пусть python вызовет исключение по типу утки) AttributeOutOfRange является более конкретным ValueError InvalidOperationException может быть любым числом приблизительно эквивалентных исключений из стандартной библиотеки Python.

По сути, выберите тот, который отражает любую ошибку, которую вы вызываете, на основе описаний со страницы http://docs.python.org/library/exceptions.html.

13 голосов
/ 04 ноября 2010

Во-первых, Python выдвигает для вас стандартные исключения.

Лучше попросить прощения, чем попросить разрешения

Просто попробуйте выполнить операцию и позвольте Python вызвать исключение. Не заключайте в скобки все с if would_not_work(): raise Exception. Никогда не стоит писать. Python уже делает это в всех случаях.

Если вы считаете, что вам нужно вызвать стандартное исключение, вы, вероятно, пишете слишком много кода.

Возможно, вам придется поднять ValueError.

def someFunction( arg1 ):
    if arg1 <= 0.0:
        raise ValueError( "Guess Again." )

Время от времени вам может понадобиться поднять TypeError, но это редко.

def someFunctionWithConstraints( arg1 ):
    if isinstance(arg1,float):
         raise TypeError( "Can't work with float and can't convert to int, either" )
    etc.

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

 class MyException( Exception ): 
     pass

Это все, что нужно для создания чего-то особенного и уникального для вашего приложения.

5 голосов
/ 04 ноября 2010

Кажется, я помню, как обучался документации, что можно вызывать предопределенные исключения, если они уместны.Например, рекомендуемый способ завершения - больше не вызывать exit (), а вызывать SystemExit.

Другой приведенный пример - повторное использование исключения IndexError для пользовательских типов контейнеров.

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

2 голосов
/ 04 ноября 2010

Pythonic - это просто пропуск исключений из самого Python. Например, вместо:

def foo(arg):
  if arg is None:
    raise SomeNoneException
  bar = arg.param

Просто сделай:

def foo(arg):
  bar = arg.param

Если arg равен None или не имеет атрибута param, вы получите исключение из самого Python.

В Python глоссарий это называется "EAFP":

Проще просить прощения, чем разрешения. Это обычное Python-кодирование стиль предполагает наличие действительного ключи или атрибуты и ловит исключения, если предположение оказывается ложный. Этот чистый и быстрый стиль характеризуется наличием многих попробуй кроме заявлений. техника контрастирует с LBYL (смотри, прежде чем прыгать) стиль, общий для многих других языков такие как C.

И это хорошо работает в тандеме с присущей Python философией печатания уток.


Это не означает, что вы не должны создавать свои собственные исключения, конечно, просто вам не нужно оборачивать уже существующие исключения Python.

Для ваших собственных исключений создайте классы, основанные на Exception, и бросайте их, когда это подходит.

...