用try-except语句来包围并捕获相应的异常:
import urllib.error
import urllib.request
url="http://blog.youkuaiyun.com"
try:
file1=urllib.request.urlopen(url)
print("ok")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
输出结果为:
ok
一般产生Error的原因有如下几种可能:
- 链接不上服务器
- 远程URL不存在
- 无网络
- 触发了HTTPError
注意:HTTPError无法处理以上前三种错误,要用URLError!
我们将url改为一个不存在的网址:
import urllib.error
import urllib.request
url="http://blog.baiduyoukuaiyun.com"
try:
file1=urllib.request.urlopen(url)
print("ok")
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
输出如下:
[Errno 11001] getaddrinfo failed
在实际处理异常过程中,我们并不知道HTTPError是不是能处理,我们可以先让其用HTTPError子类进行处理,若无法处理,再让其用URLError进行处理,代码如下:
import urllib.error
import urllib.request
url="http://blog.baiduyoukuaiyun.com"
try:
file1=urllib.request.urlopen(url)
print("ok")
except urllib.error.HTTPError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
在上述代码中,我们先用子类进行异常处理,若无法处理,再用父类进行异常处理,此时,不管发生的是哪种异常,都能够进行完美处理。
常见的状态码及含义:
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
101: 转换协议 在发送完这个响应最后的空行后,将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成 处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
304:请求的资源未更新 处理方式:丢弃
400:非法请求 处理方式:丢弃
401:未授权 处理方式:丢弃
403:禁止 处理方式:丢弃
404:没有找到 处理方式:丢弃
500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在的源代码出现错误时出现。
501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502:错误网关 作为网关或者工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错 由于临时的维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
总结:
(1)如果是引发了HTTPError异常,则判断出有e.code ,就会既输出状态码也输出错误原因
(2)若引发异常的原因是“连接不上服务器”、“远程URL不存在”、“无网络”等异常中的一个,则判断没有e.code。所以只会输出e.reason .不管是何种原因。都能得到解决。
参考:https://blog.youkuaiyun.com/weixin_40411446/article/details/80825234
以上,记录本人学习过程