2

次のトレースバックで python-requests ライブラリがクラッシュしています

Traceback (most recent call last):
  File "/usr/lib/python3.2/http/client.py", line 529, in _read_chunked
    chunk_left = int(line, 16)
ValueError: invalid literal for int() with base 16: b''

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "./app.py", line 507, in getUrlContents
    response = requests.get(url, headers=headers, auth=authCredentials, timeout=http_timeout_seconds)
  File "/home/dotancohen/code/lib/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/home/dotancohen/code/lib/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/dotancohen/code/lib/requests/sessions.py", line 338, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/dotancohen/code/lib/requests/sessions.py", line 441, in send
    r = adapter.send(request, **kwargs)
  File "/home/dotancohen/code/lib/requests/adapters.py", line 340, in send
    r.content
  File "/home/dotancohen/code/lib/requests/models.py", line 601, in content
    self._content = bytes().join(self.iter_content(CONTENT_CHUNK_SIZE)) or bytes()
  File "/home/dotancohen/code/lib/requests/models.py", line 542, in generate
    for chunk in self.raw.stream(chunk_size, decode_content=True):
  File "/home/dotancohen/code/lib/requests/packages/urllib3/response.py", line 222, in stream
    data = self.read(amt=amt, decode_content=decode_content)
  File "/home/dotancohen/code/lib/requests/packages/urllib3/response.py", line 173, in read
    data = self._fp.read(amt)
  File "/usr/lib/python3.2/http/client.py", line 489, in read
    return self._read_chunked(amt)
  File "/usr/lib/python3.2/http/client.py", line 534, in _read_chunked
    raise IncompleteRead(b''.join(value))
http.client.IncompleteRead: IncompleteRead(0 bytes read)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.2/threading.py", line 740, in _bootstrap_inner
    self.run()
  File "./app.py", line 298, in run
    self.target(*self.args)
  File "./app.py", line 400, in provider_query
    url_contents = getUrlContents(str(providerUrl), '', authCredentials)
  File "./app.py", line 523, in getUrlContents
    except http.client.IncompleteRead as error:
NameError: global name 'http' is not defined

ご覧のとおり、行でスローされているhttp.client.IncompleteRead: IncompleteRead(0 bytes read)エラーをキャッチしようとしました。ただし、それは定義されていないためにスローされます。では、どうすればその例外をキャッチできますか?requestsexcept http.client.IncompleteRead as error:NameErrorhttp

これは、例外をスローするコードです。

import requests
from requests_oauthlib import OAuth1

authCredentials = OAuth1('x', 'x', 'x', 'x')
response = requests.get(url, auth=authCredentials, timeout=20)

httpライブラリは含まれていますが、含まれていないことに注意してくださいrequests。エラーは非常に断続的です (コマンドを 10 秒ごとに実行しても、おそらく数時間ごとに発生します) ため、ライブラリをインポートにrequests.get()追加したことが役に立ったかどうかはわかりません。http

いずれにせよ、一般的な意味で、含まれているライブラリ A にライブラリ B が含まれている場合、B を自分で含めずに B から例外をキャッチすることは不可能ですか?

4

2 に答える 2

4

あなたの質問に答えるために

いずれにせよ、一般的な意味で、含まれているライブラリ A にライブラリ B が含まれている場合、B を自分で含めずに B から例外をキャッチすることは不可能ですか?

はい。例えば:

a.py:

import b

# do some stuff with b

c.py:

import a

# but you want to use b
a.b  # gives you full access to module b which was imported by a

これで問題はありませんが、実際のパッケージ/モジュール/クラス/関数名が長い場合は特に、見栄えがよくありません。

したがって、例外を処理する場合は、インポートhttp内のどのパッケージ/モジュールを理解しようとするか、標準ライブラリとしてインポートするだけです。requestshttpraise requests.XX.http.WhateverErrorhttp

于 2013-07-23T14:26:32.270 に答える
1

ソースとスタウトだけを提供しない場合、問題を分析するのは困難ですが、このリンクをチェックしてください: http://docs.python-requests.org/en/latest/user/quickstart/#errors-and-exceptions

基本的に、コード内でエラーが発生している場所で例外をキャッチしてみてください。例外:

In the event of a network problem (e.g. DNS failure, refused connection, etc), 
Requests will raise a **ConnectionError** exception.

In the event of the rare invalid HTTP response, 
Requests will raise an **HTTPError** exception.

If a request times out, a **Timeout** exception is raised.

If a request exceeds the configured number of maximum redirections,
 a **TooManyRedirects** exception is raised.

All exceptions that Requests explicitly raises inherit 
from **requests.exceptions.RequestException.**

それが役に立ったことを願っています。

于 2013-07-23T14:49:47.090 に答える