Fre*_*Foo 5 python exception-handling exception urllib2
urllib2.HTTPError
如果它是404,我想抓住额外的信息:
try:
data = urlopen(url)
except HTTPError, e: # Python 2.5 syntax
if e.code == 404:
raise HTTPError('data not found on remote')
else:
raise
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为HTTPError
init的多个参数都是未记录的.它确实有效,它将失去回溯和原始信息.我也试过了
if e.code == 404:
e.message = 'data not found on remote: %s' % e.message
raise
Run Code Online (Sandbox Code Playgroud)
但这只是在没有额外信息的情况下重新提出异常.我该怎么办?
HTTPError已包含您需要的所有信息,您可以像这样简单地重新加载它
raise HTTPError(e.url, e.code, "your message.", e.hdrs, e.fp)
Run Code Online (Sandbox Code Playgroud)
你只需要使用e.msg
而不是e.message
.剧本:
from urllib2 import urlopen, HTTPError
url = 'http://www.red-dove.com/frob'
try:
data = urlopen(url)
except HTTPError, e: # Python 2.5 syntax
if e.code == 404:
e.msg = 'data not found on remote: %s' % e.msg
raise
Run Code Online (Sandbox Code Playgroud)
版画
Traceback (most recent call last):
File "c:\temp\test404.py", line 6, in <module>
data = urlopen(url)
File "C:\Python\Lib\urllib2.py", line 124, in urlopen
return _opener.open(url, data)
File "C:\Python\Lib\urllib2.py", line 387, in open
response = meth(req, response)
File "C:\Python\Lib\urllib2.py", line 498, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Python\Lib\urllib2.py", line 425, in error
return self._call_chain(*args)
File "C:\Python\Lib\urllib2.py", line 360, in _call_chain
result = func(*args)
File "C:\Python\Lib\urllib2.py", line 506, in http_error_default
raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 404: data not found on remote: Not Found
Run Code Online (Sandbox Code Playgroud)
您当然可以通过附带的尝试/除外:
from urllib2 import urlopen, HTTPError
url = 'http://www.red-dove.com/frob'
try:
try:
data = urlopen(url)
except HTTPError, e: # Python 2.5 syntax
if e.code == 404:
e.msg = 'data not found on remote: %s' % e.msg
raise
except HTTPError, e:
print e
Run Code Online (Sandbox Code Playgroud)
打印简单
HTTP Error 404: data not found on remote: Not Found
Run Code Online (Sandbox Code Playgroud)
例外有所有原始细节:e.__dict__
看起来像
{'__iter__': <bound method _fileobject.__iter__ of <socket._fileobject object at 0x00AF2EF0>>,
'code': 404,
'fileno': <bound method _fileobject.fileno of <socket._fileobject object at 0x00AF2EF0>>,
'fp': <addinfourl at 12003088 whose fp = <socket._fileobject object at 0x00AF2EF0>>,
'hdrs': <httplib.HTTPMessage instance at 0x00B727B0>,
'headers': <httplib.HTTPMessage instance at 0x00B727B0>,
'msg': 'data not found on remote: Not Found',
'next': <bound method _fileobject.next of <socket._fileobject object at 0x00AF2EF0>>,
'read': <bound method _fileobject.read of <socket._fileobject object at 0x00AF2EF0>>,
'readline': <bound method _fileobject.readline of <socket._fileobject object at 0x00AF2EF0>>,
'readlines': <bound method _fileobject.readlines of <socket._fileobject object at 0x00AF2EF0>>,
'url': 'http://www.red-dove.com/frob'}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11188 次 |
最近记录: |