Где стандартный список исключений python для программ для повышения?

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

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

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

EDIT: я не спрашиваю, как обрабатывать исключения, но какие типы я могу и должен поднимать там, где это необходимо.

Ответы

Ответ 1

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

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

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

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

В принципе, выберите тот, который отражает любую ошибку, которую вы поднимаете, основываясь на описаниях на странице http://docs.python.org/library/exceptions.html.

Ответ 2

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

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

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

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

Возможно, вам придется поднять 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

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

Ответ 3

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

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

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

Ответ 4

Путь 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 glossary это называется "EAFP":

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

И он хорошо работает в тандеме с философией философии утиного языка у Python.


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

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