2013-10-14 23 views
9

ben yakalamak ve sadece bununla baskı Python İstekler ConnectionErrors ince ediyorum:Python'dan Bağlantı Errno'u Bağlıyor ConnectionError?

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 61] Connection refused) 

ve

HTTPSConnectionPool(host='10.100.24.16', port=443): Max retries exceeded with url: /api/datastores/06651841-bbdb-472a-bde2-689d8cb8da19 (Caused by <class 'socket.error'>: [Errno 65] No route to host) 

Ve diğerleri

:

except requests.exceptions.ConnectionError as e: 
    logger.warning(str(e.message)) 

gibi mesajların yazdırır. Merak ettiğim şey, mesajda görüntülenen errno'yu elde etmenin en iyi, en Pythonic olanı nedir? Sorunları yakalamak ve kullanıcıya mümkün olduğunca yararlı ve ilgili hata mesajı sunmak için güvenilir bir sisteme sahip olmak isterim. Anlayabildiğim kadarıyla, ConnectionError, BaseException'ın sunduğunun ötesinde yeni özellikler veya yöntemler eklenmeden, BaseException'ın dolaylı bir merhumudur. Sadece regex kullanmakta tereddüt ediyorum çünkü bana öyle geliyor ki, tüm hata mesajlarının tüm lokalitelerde aynı şekilde biçimlendirildiğini varsaymak riski taşıyor.

cevap

23

Sanırım e.args[0].reason.errno kullanarak erişebilirsiniz.

Muhtemelen bir yerde belgelenebilir, ancak genellikle böyle bir şeyi izlemek zorunda kaldığımda, yalnızca konsolda denerim ve biraz kazarım. (IPython kullanıyorum, bu yüzden sekme denetimi yapmak çok kolay, ama hadi bunu denemeyin). ,

>>> e.args 
(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),) 
>>> e.args[0] 
MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",) 

içinde baktığımızda:

>>> e 
ConnectionError(MaxRetryError("HTTPConnectionPool(host='not.a.real.url', port=80): Max retries exceeded with url: /really_not (Caused by <class 'socket.gaierror'>: [Errno -2] Name or service not known)",),) 

Bilgi args genellikle:

İlk olarak, e bize hatayı vermelidir

import requests 
try: 
    requests.get("http://not.a.real.url/really_not") 
except requests.exceptions.ConnectionError as e: 
    pass 

kullanarak bir hata oluşturmasına izin görüyoruz:

teşvik
>>> dir(e.args[0]) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', 
'__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', 
'__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'message', 'pool', 
'reason', 'url'] 

reason görünüyor:

>>> e.args[0].reason 
gaierror(-2, 'Name or service not known') 
>>> dir(e.args[0].reason) 
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', 
'__getitem__', '__getslice__', '__hash__', '__init__', '__module__', '__new__', 
'__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', 
'__str__', '__subclasshook__', '__unicode__', '__weakref__', 'args', 'errno', 'filename', 
'message', 'strerror'] 
>>> e.args[0].reason.errno 
-2 
+0

+1: Çok aferin! Çok teşekkür ederim! Dir (e) ve e.args kadar uzağa gitmiştim, ama o noktada durup durduğumda e.args elemanlarının, istediğim bilgiyi çıkarmak için regex kullanmak zorunda kalacağım dizeleriyle karıştırdım. – ArtOfWarfare

+0

Sahte URL kullanımı da hata oluşturmak için hoş bir dokunuş oldu. Gerçek URL'leri kullanıyordum, fakat internet sitem kapalıyken ... hatalar üretip bunları araştırmak arasında gidip gelmek zordu. – ArtOfWarfare

+0

oh lordum - teşekkür ederim teşekkür ederim - bu hata beni batty sürüyor! –