web-dev-qa-db-ja.com

Python例外処理を要求する

pythonライブラリリクエストで例外を処理する方法?たとえば、PCがインターネットに接続されていることを確認する方法は?

しようとすると

try:
    requests.get('http://www.google.com')
except ConnectionError:
    # handle the exception

エラー名ConnectionErrorが定義されていません

32
tux

あなたがimport requests、必要なrequests.ConnectionErrorConnectionErrorは、requestsで定義された例外です。 APIドキュメント を参照してください。

したがって、コードは次のようになります。

try:
   requests.get('http://www.google.com')
except requests.ConnectionError:
   # handle the exception
67
kindall

明確にするために、それは

except requests.ConnectionError:

ない

import requests.ConnectionError

また、一般的な例外をキャッチすることもできます(ただし、これは推奨されません)。

except Exception:
7
StackG

実際、requests.get()が生成できる例外は、ConnectionErrorだけではありません。実稼働環境で見たものを以下に示します。

from requests import ReadTimeout, ConnectTimeout, HTTPError, Timeout, ConnectionError

try:
    r = requests.get(url, timeout=6.0)
except (ConnectTimeout, HTTPError, ReadTimeout, Timeout, ConnectionError):
    continue
4
kravietz

import requestsを使用して要求モジュールを含めます。

例外処理を実装することは常に適切です。スクリプトの予期しない終了を回避するのに役立つだけでなく、エラーや情報通知を記録するのにも役立ちます。 Pythonリクエストを使用する場合、次のような例外をキャッチすることを好みます。

try:
    res = requests.get(adress,timeout=30)
except requests.ConnectionError as e:
    print("OOPS!! Connection Error. Make sure you are connected to Internet. Technical Details given below.\n")
    print(str(e))            
    continue
except requests.Timeout as e:
    print("OOPS!! Timeout Error")
    print(str(e))
    continue
except requests.RequestException as e:
    print("OOPS!! General Error")
    print(str(e))
    continue
except KeyboardInterrupt:
    print("Someone closed the program")
1
Tanmoy Datta

ドキュメント に従って、以下の点を追加しました:-

  1. ネットワークの問題(接続の拒否、インターネットの問題など)が発生した場合、リクエストはConnectionError例外を発生させます。

    try:
       requests.get('http://www.google.com')
    except requests.ConnectionError:
       # handle ConnectionError the exception
    
  2. まれに無効なHTTP応答が発生した場合、リクエストはHTTPError例外を発生させます。 HTTP要求が失敗したステータスコードを返した場合、Response.raise_for_status()はHTTPErrorを発生させます。

    try:
       r = requests.get('http://www.google.com/nowhere')
       r.raise_for_status()
    except requests.exceptions.HTTPError as err:
       #handle the HTTPError request here
    
  3. リクエストがタイムアウトした場合、タイムアウト例外が発生します。

    タイムアウト引数を使用して、指定された秒数後に応答の待機を停止するようにリクエストに指示できます。

    requests.get('https://github.com/', timeout=0.001)
    # timeout is not a time limit on the entire response download; rather, 
    # an exception is raised if the server has not issued a response for
    # timeout seconds
    
  4. Requestsが明示的に発生させるすべての例外は、requests.exceptions.RequestExceptionから継承します。したがって、ベースハンドラーは次のようになります。

    try:
       r = requests.get(url)
    except requests.exceptions.RequestException as e:
       # handle all the errors here
    
1
abhishek kasana