web-dev-qa-db-ja.com

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: name 'text' is not definedを返します。

Try/exceptブロックの外部で変数テキストを使用可能にするにはどうすればよいですか?

32
x0x

tryステートメントは新しいスコープを作成しませんが、_url lib.request.urlopen_の呼び出しで例外が発生した場合、textは設定されません。おそらくelse句にprint(text)行が必要なので、例外がない場合にのみ実行されます。

_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)
_
44
chepner

前に回答したように、_try except_句を使用して新しいスコープが導入されることはありません。したがって、例外が発生しない場合は、localsリストに変数が表示され、現在の(場合によってはグローバル)スコープでアクセスできるはずです。

_print(locals())
_

モジュールスコープ(あなたの場合)locals() == globals()

3
4xy

texttryブロックの外で変数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)
1