【重大发现】教材中的错误之一:访问同样url,异常处理为何两种写法结果却不同...
本帖最后由 lzb1001 于 2022-5-6 12:49 编辑写法1:
from urllib.request import Request, urlopen
from urllib.error import URLError, HTTPError
req = Request('http://www.fishc.com/ooxx.html')
try:
response = urlopen(req)
except HTTPError as e: # 子类HTTPError必须写在URLError的前面!
print('The sever couldn\'t fulfill the request!')
print('Error code:', e.code)
except URLError as e:
print('We failed to reach a sever!')
print('Reason:', e.reason)
#else:
# Everything is fine
得到结果如下:
The sever couldn't fulfill the request!
Error code: 404
-------------------------------------------
写法2:
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request('http://www.fishc.com/ooxx.html')
try:
response = urlopen(req)
except URLError as e:
if hasattr(e, 'reason'):
print('We failed to reach a server!')
print('Reason:', e.reason)
elif hasattr(e, 'code'):
print('The server couldn\'t fulfill the request!')
print('Error code:', e.code)
#else:
# Everything is fine
得到结果如下:
We failed to reach a server!
Reason: Not Found
------------------------
上面两个写法是完全按照小甲鱼的教材的哦……
【最新发现】
写法2其实也要像写法1那样,把HTTPError写在前面,即:
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request('http://www.fishc.com/ooxx.html')
try:
response = urlopen(req)
except URLError as e:
if hasattr(e, 'code'):
print('The server couldn\'t fulfill the request!')
print('Error code:', e.code)
elif hasattr(e, 'reason'):
print('We failed to reach a server!')
print('Reason:', e.reason)
#else:
# Everything is fine
这样得到的结果就和写法1完全一致了:
The server couldn't fulfill the request!
Error code: 404
【重要结论】
看来小甲鱼在书面教材、视频教材中的都错了,应该两种写法都要把HTTPError(写法1)或HTTPError相关内容(写法2)写在前面才行 没错吧,只是两种形式...... python爱好者. 发表于 2022-5-6 12:56
没错吧,只是两种形式......
如果按教材中的第二种写法(如下),应该永远得到的都是URLError的结果,得不到HTTPError的结果,你可以试下看看
写法2:
from urllib.request import Request, urlopen
from urllib.error import URLError
req = Request('http://www.fishc.com/ooxx.html')
try:
response = urlopen(req)
except URLError as e:
if hasattr(e, 'reason'):
print('We failed to reach a server!')
print('Reason:', e.reason)
elif hasattr(e, 'code'):
print('The server couldn\'t fulfill the request!')
print('Error code:', e.code)
#else:
# Everything is fine
lzb1001 发表于 2022-5-6 13:34
如果按教材中的第二种写法(如下),应该永远得到的都是URLError的结果,得不到HTTPError的结果,你可以 ...
URLError 是 HTTPError 的大类吧 python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?
请知道的大神来说道说道确认下 lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?
请知道 ...
如果有需要的话,可以放在前面,我也不太懂这方面,所以......
@isdkz python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧
确实 lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?
请知道 ...
是小甲鱼那里有点问题,因为 HTTPError 是 URLError 的子类,
所以 HTTPError 对象也是有 reason 属性的,所以先判断它有没有 reason 属性的话,
不管是 HTTPError 还是 URLError 都只会执行第一个分支,
所以应该是先判断它有没有 code 属性,
你是对的 {:5_106:}
页:
[1]