Различия в исключении [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
211
задан Peter Graham 29 March 2010 в 05:16
поделиться

4 ответа

Определяющим документом является PEP-3110: Catching Exceptions

Сводка:

  • В Python 3.x использование as требуется , чтобы назначить исключение для переменной.
  • В Python 2.6+ используйте синтаксис as, так как он намного менее двусмыслен и совместим с Python 3.x.
  • В Python 2.5 и ранее используйте запятую, так как as не поддерживается.
239
ответ дан Amber 24 August 2018 в 21:41
поделиться
  • 1
    Использование as - единственный способ назначить исключение локальному в Python 3.x. Но as не required , так как вам не нужно указывать его, если он вам вообще не нужен. – mercator 13 April 2015 в 13:20

Да, это законно. Я запускаю Python 2.6

try:
    [] + 3
except Exception as x:
    print "woo hoo"

>>> 
woo hoo

Обновление: есть еще одна причина использовать синтаксис as. Использование , делает вещи намного более неоднозначными, как указывали другие; и вот что делает разницу. С Python 2.6 существует multicatch, который позволяет вам улавливать несколько исключений в одном блоке except . В такой ситуации более выразительно и pythonic сказать

except (exception1, exception2) as e

, а не говорить

except (exception1, exception2), e

, который все равно будет работать

35
ответ дан Community 24 August 2018 в 21:41
поделиться
  • 1
    Версия Python до 2.6 позволила вам использовать кортеж, чтобы поймать несколько типов исключений. Но синтаксис был запутан; вы использовали бы except NameError, ValueError:, а затем задавались вопросом, почему исключение ValueError никогда не попадалось. Или использовали except (NameError, e): и оставили NameError для 'e'! – Martijn Pieters♦ 14 December 2013 в 13:41

синтаксис «как» является предпочтительным, но если ваш код должен работать со старыми версиями Python (2.6 первым поддерживает новый), тогда вам нужно будет использовать синтаксис запятой.

17
ответ дан endolith 24 August 2018 в 21:41
поделиться

Если вы хотите поддерживать все версии python, вы можете использовать функцию sys.exc_info () следующим образом:

try:
    a = 1/'0'
except (ZeroDivisionError, TypeError):
    e = sys.exc_info()[1]
    print(e.args[0])

(source: http://python3porting.com/noconv. HTML )

8
ответ дан pthomaid 24 August 2018 в 21:41
поделиться
  • 1
    Примечание. Здесь есть некоторые угловые случаи. В Py3 цель as (вместе с остальной информацией об исключении) неявно del изменена, как только вы выходите из блока except (это предотвращает замедление некоторых циклических ссылок в сохраненной трассировке от задержки выпуска память, пока циклический GC не начнет работать). Таким образом, этот эквивалентный код немного меньше эквивалентен, если вы не используете try/finally в блоке except, чтобы убедиться, что del e выполняется перед выходом из блока except. – ShadowRanger 25 April 2017 в 21:42
Другие вопросы по тегам:

Похожие вопросы: