lzb1001 发表于 2022-5-6 12:12:35

【重大发现】教材中的错误之一:访问同样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:41

没错吧,只是两种形式......

lzb1001 发表于 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

python爱好者. 发表于 2022-5-6 14:00:13

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

URLError 是 HTTPError 的大类吧

lzb1001 发表于 2022-5-6 14:04:02

python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧

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

请知道的大神来说道说道确认下

python爱好者. 发表于 2022-5-6 14:28:21

lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?

请知道 ...

如果有需要的话,可以放在前面,我也不太懂这方面,所以......
@isdkz

isdkz 发表于 2022-5-6 14:45:07

python爱好者. 发表于 2022-5-6 14:00
URLError 是 HTTPError 的大类吧

确实

isdkz 发表于 2022-5-6 14:49:15

lzb1001 发表于 2022-5-6 14:04
对,HTTPError是URLError的子类,所以是不是两种写法都要把子类HTTPError写在URLError的前面?

请知道 ...

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

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

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

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

你是对的 {:5_106:}
页: [1]
查看完整版本: 【重大发现】教材中的错误之一:访问同样url,异常处理为何两种写法结果却不同...