鱼C论坛

 找回密码
 立即注册
查看: 1410|回复: 7

【重大发现】教材中的错误之一:访问同样url,异常处理为何两种写法结果却不同...

[复制链接]
发表于 2022-5-6 12:12:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 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)写在前面才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-5-6 12:56:41 | 显示全部楼层
没错吧,只是两种形式......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 13:34:44 | 显示全部楼层
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 14:00:13 | 显示全部楼层
lzb1001 发表于 2022-5-6 13:34
如果按教材中的第二种写法(如下),应该永远得到的都是URLError的结果,得不到HTTPError的结果,你可以 ...

URLError 是 HTTPError 的大类吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-6 14:04:02 | 显示全部楼层
python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧

对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?

请知道的大神来说道说道确认下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 14:28:21 | 显示全部楼层
lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?

请知道 ...

如果有需要的话,可以放在前面,我也不太懂这方面,所以......
@isdkz
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 14:45:07 | 显示全部楼层
python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧

确实
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-6 14:49:15 | 显示全部楼层
lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?

请知道 ...

是小甲鱼那里有点问题,因为 HTTPError 是 URLError 的子类,

所以 HTTPError 对象也是有 reason 属性的,所以先判断它有没有 reason 属性的话,

不管是 HTTPError 还是 URLError 都只会执行第一个分支,

所以应该是先判断它有没有 code 属性,

你是对的

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
python爱好者. + 5 + 5 + 3 那是我错了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 18:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表