Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена в нуль (т. е. она не ссылалась на экземпляр фактического объекта).
Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для 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
}
Определяющим документом является PEP-3110: Catching Exceptions
Сводка:
as
требуется , чтобы назначить исключение для переменной. as
, так как он намного менее двусмыслен и совместим с Python 3.x. as
не поддерживается. Да, это законно. Я запускаю 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
, который все равно будет работать
except NameError, ValueError:
, а затем задавались вопросом, почему исключение ValueError
никогда не попадалось. Или использовали except (NameError, e):
и оставили NameError
для 'e'
!
– Martijn Pieters♦
14 December 2013 в 13:41
синтаксис «как» является предпочтительным, но если ваш код должен работать со старыми версиями Python (2.6 первым поддерживает новый), тогда вам нужно будет использовать синтаксис запятой.
Если вы хотите поддерживать все версии 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 )
as
(вместе с остальной информацией об исключении) неявно del
изменена, как только вы выходите из блока except
(это предотвращает замедление некоторых циклических ссылок в сохраненной трассировке от задержки выпуска память, пока циклический GC не начнет работать). Таким образом, этот эквивалентный код немного меньше эквивалентен, если вы не используете try/finally
в блоке except
, чтобы убедиться, что del e
выполняется перед выходом из блока except
.
– ShadowRanger
25 April 2017 в 21:42
as
- единственный способ назначить исключение локальному в Python 3.x. Ноas
не required i>, так как вам не нужно указывать его, если он вам вообще не нужен. – mercator 13 April 2015 в 13:20