2014-09-04 6 views
8

Wie kann ich eine Variable im try/except Block public machen?Wie kann man eine Variable in einem try/except Block public machen?

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) 

Dieser Code gibt einen Fehler NameError: name 'text' is not defined zurück.

Wie kann ich den variablen Text außerhalb des try/except-Blocks verfügbar machen?

+0

Was wird 'Text' wenn' page = urllib.request.urlopen (url) 'wird eine Ausnahme ausgelöst? Wenn Sie es mit einem bestimmten Wert setzen möchten, können Sie dies im Bereich except oder außerhalb des Blocks "try except" tun. –

+0

'Text' ist das Markup der URL. – x0x

+0

Im 'except' Fall' text' ist * nie zugewiesen *. Sie könnten 'text = None' in diesem Block oder vor dem' try' setzen. Dies ist kein Bereichsproblem. – jonrsharpe

Antwort

15

try Anweisungen erstellen keinen neuen Bereich, aber text wird nicht festgelegt, wenn der Aufruf an url lib.request.urlopen die Ausnahme auslöst. Sie wollen wahrscheinlich die print(text) Zeile in einer else Klausel, so dass es nur ausgeführt wird, wenn es keine Ausnahme gibt.

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) 

Wenn text Bedarf später verwendet werden, die Sie wirklich brauchen, um darüber nachzudenken, was seinen Wert sein soll, wenn die Zuordnung zu page ausfällt und Sie können page.read() nicht nennen. Sie können ihm vor, einen Anfangswert geben die try Aussage:

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) 

oder in der else Klausel:

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) 
+0

Ich denke, das OP will einen Standardwert für 'text', wenn es eine' exception' gibt. Vielleicht hilft ihm das Aktualisieren dieser Antwort mit dem Standardwert außerhalb des Bereichs "try except" oder innerhalb der else. –

+0

Im letzten Ausschnitt wird 'text' immer ''something'' zugewiesen, wenn keine Ausnahme vorhanden ist – 4xy

0

erklären Sie einfach die Variable text außerhalb 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) 
+2

//, Warum wäre das nötig? Python hat keinen separaten Block-Level-Bereich für diese "try" und "except", AFAIK und gemäß http://stackoverflow.com/questions/17195569/using-a-variable-in-a-try-catch -finally-statement-ohne-deklarieren-es-draußen. –

0

Sie können dies versuchen:

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 
+1

Würden Sie 'text' mit' 'somthing'' überschreiben, wenn keine Ausnahme auftritt? – 4xy

+0

Dieser Code funktioniert nicht – 4xy

0

Wie bereits erwähnt, gibt es keinen neuen Bereich, der mit der try except -Klausel eingeführt wurde. Wenn keine Ausnahme auftritt, sollten Sie Ihre Variable in der Liste locals sehen und im aktuellen (in Ihrem Fall globalen) Bereich verfügbar sein.

print(locals()) 

Im Modul Rahmen (Ihr Fall) locals() == globals()

Verwandte Themen