当前位置:  开发笔记 > 编程语言 > 正文

使用urllib2.Request/urlopen需要处理哪些错误/异常?

如何解决《使用urllib2.Request/urlopen需要处理哪些错误/异常?》经验,为你挑选了3个好方法。

我有以下代码来回发到远程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是一个使用日志记录的记录器.

我有一个问题,当远程服务器关闭并且代码退出时,此代码运行(这是在客户服务器上,因此我不知道此时退出堆栈转储/错误是什么).我假设这是因为存在未处理的异常和/或错误.那么有没有其他可能触发的异常,我没有在上面处理?



1> vartec..:

添加通用异常处理程序

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())



2> DNS..:

从文档页面 urlopen条目,看起来你只需要捕获URLError.如果你真的想在urllib代码中针对问题对冲你的赌注,你也可以Exception作为后备.难道只是except:,因为这将赶上SystemExitKeyboardInterrupt也.

编辑:我的意思是说,你正在捕捉它应该抛出的错误.如果它正在抛出其他东西,那可能是因为urllib代码没有捕获它应该捕获并包裹在其中的东西URLError.即使是stdlib也会错过简单的事情AttributeError.捕捉Exception作为后备(并记录它捕获的内容)将帮助你弄清楚发生了什么,没有陷阱SystemExitKeyboardInterrupt.


+1让我知道除了以外有什么区别:除了Exception(至少有一个).

3> Steven Huwig..:
$ 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记录文件中所有未捕获的异常.这里的关键经验是永远不会捕获您不打算纠正的异常,并且记录不是纠正.所以不要只是为了记录它们而抓住它们.

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有