Как сделать переменную внутри блока try/except общедоступной?

Как я могу сделать переменную внутри блока try/except общедоступной?

import urllib.request

try:
    url = "http://www.google.com"
    page = urllib.request.urlopen(url)
    text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
    print("Unable to process your request dude!!")

print(text)

Этот код возвращает ошибку

NameError: имя «текст» не определено

Как я могу сделать переменный текст доступным за пределами блока try/except?


person x0x    schedule 04.09.2014    source источник
comment
Что будет text, если page = urllib.request.urlopen(url) вызовет исключение? Если вы хотите установить для него какое-то значение, вы можете сделать это в области исключения или вне блока try except.   -  person Kobi K    schedule 04.09.2014
comment
text — это разметка URL-адреса.   -  person x0x    schedule 04.09.2014
comment
В случае except text никогда не назначается. Вы можете установить text = None в этом блоке или перед try. Это не проблема масштаба.   -  person jonrsharpe    schedule 04.09.2014
comment
если ошибка, упомянутая в вопросе, возникает без прохождения оператора печати в блоке исключений, я думаю, что исключение не перехватывается   -  person Ashoka Lella    schedule 04.09.2014
comment
// , Согласно stackoverflow.com/questions/17195569/, Python не имеет области действия блока.   -  person Nathan Basanese    schedule 31.08.2015


Ответы (3)


Инструкции try не создают новую область, но text не будет установлено, если вызов url lib.request.urlopen вызовет исключение. Вероятно, вам нужна строка print(text) в предложении else, чтобы она выполнялась только при отсутствии исключений.

try:
    url = "http://www.google.com"
    page = urllib.request.urlopen(url)
    text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
    print("Unable to process your request dude!!")
else:
    print(text)

Если text необходимо использовать позже, вам действительно нужно подумать о том, каким должно быть его значение, если присваивание page не удается и вы не можете вызвать page.read(). Вы можете присвоить ему начальное значение перед оператором try:

text = 'something'
try:
    url = "http://www.google.com"
    page = urllib.request.urlopen(url)
    text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
    print("Unable to process your request dude!!")

print(text)

или в предложении else:

try:
    url = "http://www.google.com"
    page = urllib.request.urlopen(url)
    text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
    print("Unable to process your request dude!!")
else:
    text = 'something'

print(text)
person chepner    schedule 04.09.2014
comment
Я думаю, что ОП хочет значение по умолчанию для text на случай, если есть exception. поэтому, возможно, ему поможет обновление этого ответа значением по умолчанию за пределами области try except или внутри области else. - person Kobi K; 04.09.2014
comment
В последнем фрагменте text всегда будет присвоено значение 'something', если нет исключений. - person 4xy; 16.11.2017
comment
операторы try не создают новую область видимости, это многое для меня прояснило, +1 - person Silidrone; 13.07.2020
comment
предложение else у меня не сработало, но сработало начальное значение. :D - person santma; 11.12.2020
comment
В третьем примере, помимо проблемы, упомянутой @4xy, print(text) по-прежнему будет вызывать исходный NameError, если page.read().decode('utf8') вызовет исключение. Это будет работать только в том случае, если text = 'something' будет перемещен в блок except. - person Qiang Xu; 10.05.2021

Как уже было сказано ранее, с помощью предложения try except не вводится новая область, поэтому, если не возникает исключения, вы должны увидеть свою переменную в списке locals, и она должна быть доступна в текущей (в вашем случае глобальной) области.

print(locals())

В области модуля (ваш случай) locals() == globals()

person 4xy    schedule 16.11.2017

Просто объявите переменную text вне блока try except,

import urllib.request
text =None
try:
    url = "http://www.google.com"
    page = urllib.request.urlopen(url)
    text = page.read().decode('utf8')
except (ValueError, RuntimeError, TypeError, NameError):
    print("Unable to process your request dude!!")
if text is not None:
    print(text)
person Nishant Nawarkhede    schedule 04.09.2014
comment
// , Зачем это нужно? Python не имеет отдельной области блочного уровня для этих try и except, насколько я знаю, и согласно stackoverflow.com/questions/17195569/. - person Nathan Basanese; 31.08.2015