Quelles erreurs/exceptions ai-je besoin pour gérer avec urllib2.Demande / urlopen?
J'ai le code suivant pour faire une publication à une URL distante:
request = urllib2.Request('http://www.example.com', postBackData, { 'User-Agent' : 'My User Agent' })
try:
response = urllib2.urlopen(request)
except urllib2.HTTPError, e:
checksLogger.error('HTTPError = ' + str(e.code))
except urllib2.URLError, e:
checksLogger.error('URLError = ' + str(e.reason))
except httplib.HTTPException, e:
checksLogger.error('HTTPException')
La postBackData est créé à l'aide d'un dictionnaire codé à l'aide de urllib.urlencode. checksLogger est un enregistreur à l'aide de la journalisation.
J'ai eu un problème de ce code s'exécute lorsque le serveur distant est en baisse et le code de sorties (ce qui est au client de serveurs, donc je ne sais pas ce que la sortie de vidage de pile /erreur est à ce moment). Je suppose que c'est parce qu'il est une exception et/ou de l'erreur, qui n'est pas traitée. Alors y at-il d'autres exceptions qui pourraient être déclenchés que je ne suis pas de la manipulation ci-dessus?
Vous devez vous connecter pour publier un commentaire.
Ajouter générique gestionnaire d'exception:
checksLogger.error
une fonction définie par l'utilisateur dans votre exemple?De la docs page
urlopen
entrée, on dirait que vous juste besoin de rattraper URLError. Si vraiment vous voulez couvrir vos paris à l'encontre des problèmes au sein de la urllib code, vous pouvez également prendreException
comme un recul. Ne pas justeexcept:
, depuis l'attraperSystemExit
etKeyboardInterrupt
aussi.Edit: Ce que je veux dire, c'est que vous êtes capture des erreurs qu'il est censé jeter. Si c'est jeter quelque chose d'autre, c'est probablement dû à urllib code pas attraper quelque chose qu'il doit avoir pris et enveloppé dans un
URLError
. Même les stdlib tend à manquer des choses simples commeAttributeError
. La capture deException
comme un recul (et de la journalisation de ce qu'il a attrapé) pour vous aider à comprendre ce qui se passe, sans piégeageSystemExit
etKeyboardInterrupt
.Il y a aussi la possibilité d'exceptions dans urllib2 dépendances, ou des exceptions causée par de véritables bugs.
Vous êtes mieux lotis de la journalisation de toutes les exceptions non traitées dans un fichier via un custom sys.excepthook. La clé de la règle d'or ici est de jamais attraper les exceptions que vous ne prévoyez pas de corriger, et l'enregistrement n'est pas une correction. Afin de ne pas attraper juste pour se connecter entre eux.
Vous pouvez attraper toutes les exceptions et les journaux ce qui est de coincer:
(Code de http://www.linuxjournal.com/article/5821)
Également lire documentation sur sys.exc_info.
Je catch:
Je crois que cela couvre tout, y compris les erreurs de socket.
urllib2.HTTPError
est une sous-classe deurllib2.URLError
, afin d'attraper le deuxième est assez