7

Pythonスクリプトに次のコードがあります

  try:
    # send the query request
    sf = urllib2.urlopen(search_query)
    search_soup = BeautifulSoup.BeautifulStoneSoup(sf.read())
    sf.close()
  except Exception, err:
    print("Couldn't get programme information.")
    print(str(err))
    return

sf.read()でエラーが発生した場合、sf.clsoe()が呼び出されないので心配です。ブロックを入れてみsf.close()ましたfinallyが、例外がある場合urlopen()は閉じるファイルがなく、finallyブロックで例外が発生しました!

それで、私は試しました

  try:
    with urllib2.urlopen(search_query) as sf:
      search_soup = BeautifulSoup.BeautifulStoneSoup(sf.read())
  except Exception, err:
    print("Couldn't get programme information.")
    print(str(err))
    return

しかし、これにより、行で無効な構文エラーが発生しましたwith...。どうすればこれをうまく処理できますか、私は愚かです!

コメンターが指摘したように、私はpython 2.5.4であるPys60を使用しています

4

8 に答える 8

8
finally:
    if sf: sf.close()
于 2010-10-07T12:22:23.733 に答える
7

閉じsfて、存在しない場合は合格してみませんか?

import urllib2
try:
    search_query = 'http://blah'
    sf = urllib2.urlopen(search_query)
    search_soup = BeautifulSoup.BeautifulStoneSoup(sf.read())
except urllib2.URLError, err:
    print(err.reason)
finally:
    try:
        sf.close()
    except NameError: 
        pass
于 2010-10-07T11:32:34.180 に答える
1

「with」を使用しようとしている場合、Python 2.5 を使用する必要があり、これも当てはまります: http://docs.python.org/tutorial/errors.html#defining-clean-up-actions

于 2010-10-07T10:44:56.923 に答える
0

問題は私が思っていたよりも深く実行されているようです-このフォーラムスレッドwithは、urllib2がPython 2.6の後まで、おそらく3.1まで実装されないことを示しています

于 2010-10-07T11:20:01.907 に答える
0

複数の try/except ブロックを使用しないのはなぜですか?

try:
    # send the query request
    sf = urllib2.urlopen(search_query)
except urllib2.URLError as url_error:
    sys.stderr.write("Error requesting url: %s\n" % (search_query,))
    raise

try:
    search_soup = BeautifulSoup.BeautifulStoneSoup(sf.read())
except Exception, err: # Maybe catch more specific Exceptions here
    sys.stderr.write("Couldn't get programme information from url: %s\n" % (search_query,))
    raise # or return as in your original code
finally:
    sf.close()
于 2015-03-24T13:28:39.443 に答える