我有以下代码来回发到远程URL:
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')
postBackData是使用urllib.urlencode编码的字典创建的.checksLogger是一个使用日志记录的记录器.
我有一个问题,当远程服务器关闭并且代码退出时,此代码运行(这是在客户服务器上,因此我不知道此时退出堆栈转储/错误是什么).我假设这是因为存在未处理的异常和/或错误.那么有没有其他可能触发的异常,我没有在上面处理?
添加通用异常处理程序
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') except Exception: import traceback checksLogger.error('generic exception: ' + traceback.format_exc())
从文档页面 urlopen
条目,看起来你只需要捕获URLError.如果你真的想在urllib代码中针对问题对冲你的赌注,你也可以Exception
作为后备.难道不只是except:
,因为这将赶上SystemExit
和KeyboardInterrupt
也.
编辑:我的意思是说,你正在捕捉它应该抛出的错误.如果它正在抛出其他东西,那可能是因为urllib代码没有捕获它应该捕获并包裹在其中的东西URLError
.即使是stdlib也会错过简单的事情AttributeError
.捕捉Exception
作为后备(并记录它捕获的内容)将帮助你弄清楚发生了什么,没有陷阱SystemExit
和KeyboardInterrupt
.
$ grep "raise" /usr/lib64/python/urllib2.py IOError); for HTTP errors, raises an HTTPError, which can also be raise AttributeError, attr raise ValueError, "unknown url type: %s" % self.__original # XXX raise an exception if no one else should try to handle raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) perform the redirect. Otherwise, raise HTTPError if no-one raise HTTPError(req.get_full_url(), code, msg, headers, fp) raise HTTPError(req.get_full_url(), code, raise HTTPError(req.get_full_url(), 401, "digest auth failed", raise ValueError("AbstractDigestAuthHandler doesn't know " raise URLError('no host given') raise URLError('no host given') raise URLError(err) raise URLError('unknown url type: %s' % type) raise URLError('file not on local host') raise IOError, ('ftp error', 'no host given') raise URLError(msg) raise IOError, ('ftp error', msg), sys.exc_info()[2] raise GopherError('no host given')
urllib2依赖项中也可能存在异常,或者由真正的错误引起异常.
您最好通过自定义sys.excepthook记录文件中所有未捕获的异常.这里的关键经验是永远不会捕获您不打算纠正的异常,并且记录不是纠正.所以不要只是为了记录它们而抓住它们.