40

いくつかの API テストを実行し、入力された URL を指定して関数を作成しようとすると、json 応答が返されますが、HTTP エラーが応答である場合、エラー メッセージが返されます。

以前は urllib2 を使用していましたが、代わりにリクエストを使用しようとしています。ただし、エラーに関係なく、except ブロックが実行されないようです。

testURL = 'http://httpbin.org/status/404'


def return_json(URL):
    try:
        response = requests.get(URL)
        json_obj = response.json()
        return json_obj
    except requests.exceptions.HTTPError as e:
        return "Error: " + str(e)

上記を実行して得た結果...

<Response [404]>
4

3 に答える 3

72

レスポンスで 200 以外のステータス コードの例外を発生させたい場合は、 を使用しますresponse.raise_for_status()。コードは次のようになります。

testURL = 'http://httpbin.org/status/404'


def return_json(URL):
    response = requests.get(testURL)

    try:
        response.raise_for_status()
    except requests.exceptions.HTTPError as e:
        # Whoops it wasn't a 200
        return "Error: " + str(e)

    # Must have been a 200 status code
    json_obj = response.json()
    return json_obj

これは、ここにある他のソリューションよりも明らかに単純であり、ステータス コードを手動で確認する必要がないことがわかります。HTTPErrorそれが発生するものであるため、あなたは単に をキャッチすることもできraise_for_statusます。キャッチRequestsExceptionは悪い考えです。それはConnectionErrors やTimeoutErrors などをキャッチします。それらはどれも、キャッチしようとしているものと同じことを意味しません。

于 2014-07-02T12:53:54.223 に答える
1

値を確認できresponse.status_codeます。そうでない場合は200、それをエラー状態と見なして、独自の例外をスローできます。

于 2014-07-01T20:46:48.793 に答える