try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Bu doğru mu? Bunu yapılandırmanın daha iyi bir yolu var mı? Bu tüm üslerimi kaplayacak mı?
try:
r = requests.get(url, params={'s': thing})
except requests.ConnectionError, e:
print e #should I also sys.exit(1) after this?
Bu doğru mu? Bunu yapılandırmanın daha iyi bir yolu var mı? Bu tüm üslerimi kaplayacak mı?
Yanıtlar:
İstekler istisna belgelerine bir göz atın . Kısacası:
Bir ağ sorunu olması durumunda (örn. DNS hatası, reddedilen bağlantı vb.), İstekler bir
ConnectionError
istisna oluşturur.Nadiren geçersiz HTTP yanıtı olması durumunda, İstekler bir
HTTPError
istisna oluşturur.Bir istek zaman aşımına
Timeout
uğradığında , bir istisna ortaya çıkar.Bir istek yapılandırılan maksimum yeniden yönlendirme sayısını aşarsa, bir
TooManyRedirects
istisna 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
.HTTPError
Yanı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
socket.timeout
zaman aşımı kullanıyorsanız da istisnaları yakalamanız gerektiğini unutmayın: github.com/kennethreitz/requests/issues/1236
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
İ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)