web-dev-qa-db-ja.com

pythonで特定のHTTPエラーをキャッチ

私は家族全員ではなく特定のhttpエラーをキャッチしたい..私がやろうとしていたことは-

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError:
   <whatever>

しかし、私はあらゆる種類のhttpエラーをキャッチしていますが、指定されたWebページが存在しない場合にのみキャッチしたいです!!おそらくそれはHTTPエラー404です。しかし、エラー404のみをキャッチし、システムが他のイベントのデフォルトハンドラを実行できるように指定する方法がわかりません。

60
Arnab Sen Gupta

urllib2.HTTPError、それを処理し、エラー404でない場合は、raiseを使用して例外を再発生させます。

Pythonチュートリアル を参照してください。

だからあなたができる:

import urllib2
try:
   urllib2.urlopen("some url")
except urllib2.HTTPError as err:
   if err.code == 404:
       <whatever>
   else:
       raise
106
Tim Pietzcker

Python 3.x

import urllib.request
try:
    urllib.request.urlretrieve(url, fullpath)
except urllib.error.HTTPError as err:
    print(err.code)
36
Lazik

ティムスの答えは誤解を招くように思えます。特に、urllib2が期待されるコードを返さない場合。たとえば、このエラーは致命的です(信じられないかもしれません-URLをダウンロードするとき、それは珍しいことではありません):

AttributeError:「URLError」オブジェクトには属性「code」がありません

高速ですが、最良の解決策はネストされたtry/exceptブロックを使用するコードです:

import urllib2
try:
    urllib2.urlopen("some url")
except urllib2.HTTPError, err:
    try:
        if err.code == 404:
            # Handle the error
        else:
            raise
    except:
        ...

入れ子になったtry/exceptブロックのトピックに関する詳細情報 入れ子になったtry/exceptブロックはpython良いプログラミング習慣ですか?

3
sonavolob