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

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

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: имя 'text' не определено

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

Ответ 1

Операторы

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)

Ответ 2

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

print(locals())

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

Ответ 3

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

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)

Ответ 4

вы можете попробовать следующее:

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