Python istek modülünü kullanmak dışında denemek için doğru yol?


Yanıtlar:


795

İstekler istisna belgelerine bir göz atın . Kısacası:

Bir ağ sorunu olması durumunda (örn. DNS hatası, reddedilen bağlantı vb.), İstekler bir ConnectionErroristisna oluşturur.

Nadiren geçersiz HTTP yanıtı olması durumunda, İstekler bir HTTPErroristisna oluşturur.

Bir istek zaman aşımına Timeoutuğradığında , bir istisna ortaya çıkar.

Bir istek yapılandırılan maksimum yeniden yönlendirme sayısını aşarsa, bir TooManyRedirectsistisna ortaya çıkar.

İsteklerin açıkça miras bıraktığı tüm istisnalar requests.exceptions.RequestException.

Sorunuzu cevaplamak için gösterdiğiniz şey tüm üslerinizi kapsamaz. Zaman aşımı hatalarını değil, yalnızca bağlantıyla ilgili hataları yakalarsınız.

İstisnayı yakaladığınızda ne yapmanız gerçekten script / programınızın tasarımına bağlıdır. Çıkmak kabul edilebilir mi? Devam edip tekrar deneyebilir misin? Hata felaketse ve devam edemiyorsanız, evet, SystemExit'i (hem bir hatayı hem de aramayı yazdırmanın güzel bir yolu) yükselterek programınızı iptal edebilirsiniz sys.exit.

Tüm durumları ele alacak temel sınıf istisnasını yakalayabilirsiniz:

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.RequestException as e:  # This is the correct syntax
    raise SystemExit(e)

Ya da ayrı ayrı yakalayabilir ve farklı şeyler yapabilirsiniz.

try:
    r = requests.get(url, params={'s': thing})
except requests.exceptions.Timeout:
    # Maybe set up for a retry, or continue in a retry loop
except requests.exceptions.TooManyRedirects:
    # Tell the user their URL was bad and try a different one
except requests.exceptions.RequestException as e:
    # catastrophic error. bail.
    raise SystemExit(e)

Christian'ın işaret ettiği gibi :

Http hatalarının (örn. 401 Yetkisiz) istisna oluşturmasını istiyorsanız, arayabilirsiniz Response.raise_for_status. HTTPErrorYanıt bir http hatasıysa, bu bir yükselecektir .

Bir örnek:

try:
    r = requests.get('http://www.google.com/nothere')
    r.raise_for_status()
except requests.exceptions.HTTPError as err:
    raise SystemExit(err)

Yazdırılacak:

404 Client Error: Not Found for url: http://www.google.com/nothere

11
İstek kütüphanesinin özellikleriyle ve genel istisna yakalama ile ilgili çok iyi bir cevap.
Brian Peterson

10
Altta yatan urllib3 kitaplığındaki bir hata nedeniyle, socket.timeoutzaman aşımı kullanıyorsanız da istisnaları yakalamanız gerektiğini unutmayın: github.com/kennethreitz/requests/issues/1236
jb.

15
Gelecek yorum okuyucuları: Bu, İstekler 2.9'da (urllib3 1.13'ü paketler) düzeltildi
RazerM

14
Http hatalarının (örn. 401 Yetkisiz) istisna oluşturmasını istiyorsanız Response.raise_for_status'u arayabilirsiniz . Yanıt bir http hatasıysa, bu bir HTTPError hatası oluşturur.
Christian Long

5
İstek web sitesindeki istisna listesi tam değil. Sen tam listesini okuyabilir burada .
Epoc

87

Açık olması için ek bir öneri. İstenilen hatayı yakalamak için hata yığınından aşağı doğru belirli bir genelden gitmek en iyisidir, bu yüzden belirli olanlar genel olan tarafından maskelenmez.

url='http://www.google.com/blahblah'

try:
    r = requests.get(url,timeout=3)
    r.raise_for_status()
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)

Http Error: 404 Client Error: Not Found for url: http://www.google.com/blahblah

vs

url='http://www.google.com/blahblah'

try:
    r = requests.get(url,timeout=3)
    r.raise_for_status()
except requests.exceptions.RequestException as err:
    print ("OOps: Something Else",err)
except requests.exceptions.HTTPError as errh:
    print ("Http Error:",errh)
except requests.exceptions.ConnectionError as errc:
    print ("Error Connecting:",errc)
except requests.exceptions.Timeout as errt:
    print ("Timeout Error:",errt)     

OOps: Something Else 404 Client Error: Not Found for url: http://www.google.com/blahblah

bu yazı için de geçerli bir sözdizimi mi?
ScipioAfricanus

@ScipioAfricanus evet.
andrea

10

İstisna nesnesi e.response, sunucudan yanıt olarak hata gövdesini görmeniz gerektiğinde yararlı olabilecek orijinal yanıt da içerir . Örneğin:

try:
    r = requests.post('somerestapi.com/post-here', data={'birthday': '9/9/3999'})
    r.raise_for_status()
except requests.exceptions.HTTPError as e:
    print (e.response.text)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.