web-dev-qa-db-ja.com

例外処理後にforループに戻る方法

このコードを実行する準備ができていますが、例外処理を修正する前に:

for l in bios:
    OpenThisLink = url + l
    try:
        response = urllib2.urlopen(OpenThisLink)
    except urllib2.HTTPError:
        pass
    bio = response.read()
    item = re.search('(JD)(.*?)(\d+)', bio)
    ....

提案されたように heretry...exceptを追加しましたが、ページが開かない場合、次のエラーが発生します。

bio = response.read()
NameError: name 'response' is not defined

したがって、プログラムは実行を続けます。代わりに、forループに戻って次のURLを試します。 breakではなくpassを試しましたが、プログラムは終了します。助言がありますか?

23
Zeynel

continueの代わりにbreakを使用してください。

ステートメントpassは何もしません(つまり、何もしません)。プログラムは次のステートメントに進むだけなので、エラーが発生します。

breakはループを終了し、ループの直後の次のステートメントから実行を続けます。この場合、ステートメントがなくなるため、プログラムが終了します。

continueはループを再開しますが、次のアイテムを使用します。これはまさにあなたが望むものです。

43
Mark Byers

実際に試してみると、それよりもはるかに強力です。ここでもelseブロックを使用できます。

try:
    stuff
except Exception:
    print "oh no a exception"
else:
    print "oh yay no exception"
finally:
    print "leaving the try block"
13
Jochen Ritzel

例外がスローされたときに応答変数が存在しないため、そのエラーが発生します。あなたがコードをどのようにしているかを残したい場合は、readを呼び出す前に応答が存在することを確認する必要があります

if response:
    bio = response.read()
    ...

マークに同意すると言ったが、continuepassよりも良い提案である

1
John Stallings