web-dev-qa-db-fra.com

Comment rendre une variable dans un bloc try/except public?

Comment puis-je rendre une variable dans le bloc try/except public?

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)

Ce code renvoie une erreur NameError: name 'text' is not defined

Comment puis-je rendre le texte variable disponible en dehors du bloc try/except?

22
x0x

Les instructions try ne créent pas de nouvelle portée, mais text ne sera pas défini si l'appel à url lib.request.urlopen lève l'exception. Vous voulez probablement la ligne print(text) dans une clause else, afin qu'elle ne soit exécutée que s'il n'y a pas d'exception.

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)

Si text doit être utilisé plus tard, vous devez vraiment déterminer quelle est sa valeur si l'attribution à page échoue et que vous ne pouvez pas appeler page.read(). Vous pouvez lui donner une valeur initiale avant l'instruction 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)

ou dans la clause 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)
32
chepner

Comme indiqué précédemment, aucune clause n'a été introduite à l'aide de la clause try except. Par conséquent, si aucune exception ne se produit, vous devez voir votre variable dans la liste locals et la rendre accessible dans la portée actuelle (globale de votre cas).

print(locals())

Dans l'étendue du module (votre cas) locals() == globals()

2
4xy

Il suffit de déclarer la variable text en dehors de tryexcept 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)
0
Nishant Nawarkhede