1. ホーム
  2. python

try/exceptブロック内の変数をpublicにするには?

2023-11-03 22:08:32

質問

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)

このコードはエラーを返します

NameError: 名前 'text' は定義されていません。

try/exceptブロックの外で変数textを利用できるようにするにはどうしたらよいですか?

どのように解決するのですか?

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)