处理Python中的URLError异常的方法


Posted in Python onApril 30, 2015

1.URLError

首先解释下URLError可能产生的原因:

  •     网络无连接,即本机无法上网
  •     连接不到特定的服务器
  •     服务器不存在

在代码中,我们需要用try-except语句来包围并捕获相应的异常。下面是一个例子,先感受下它的风骚
 

import urllib2
 
requset = urllib2.Request('http://www.xxxxx.com')
try:
  urllib2.urlopen(requset)
except urllib2.URLError, e:
  print e.reason

我们利用了 urlopen方法访问了一个不存在的网址,运行结果如下:
 

[Errno 11004] getaddrinfo failed

它说明了错误代号是11004,错误原因是 getaddrinfo failed

2.HTTPError

HTTPError是URLError的子类,在你利用urlopen方法发出一个请求时,服务器上都会对应一个应答对象response,其中它包含一个数字”状态码”。举个例子,假如response是一个”重定向”,需定位到别的地址获取文档,urllib2将对此进行处理。

其他不能处理的,urlopen会产生一个HTTPError,对应相应的状态吗,HTTP状态码表示HTTP协议所返回的响应的状态。下面将状态码归结如下:

  •     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:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。

HTTPError实例产生后会有一个code属性,这就是是服务器发送的相关错误号。
因为urllib2可以为你处理重定向,也就是3开头的代号可以被处理,并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。

下面我们写一个例子来感受一下,捕获的异常是HTTPError,它会带有一个code属性,就是错误代号,另外我们又打印了reason属性,这是它的父类URLError的属性。
 

import urllib2
 
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
  urllib2.urlopen(req)
except urllib2.HTTPError, e:
  print e.code
  print e.reason

运行结果如下
 

403
Forbidden

错误代号是403,错误原因是Forbidden,说明服务器禁止访问。

我们知道,HTTPError的父类是URLError,根据编程经验,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常,所以上述的代码可以这么改写
 

import urllib2
 
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
  urllib2.urlopen(req)
except urllib2.HTTPError, e:
  print e.code
except urllib2.URLError, e:
  print e.reason
else:
  print "OK"

如果捕获到了HTTPError,则输出code,不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常,输出错误原因。

另外还可以加入 hasattr属性提前对属性进行判断,代码改写如下
 

import urllib2
 
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
  urllib2.urlopen(req)
except urllib2.URLError, e:
  if hasattr(e,"code"):
    print e.code
  if hasattr(e,"reason"):
    print e.reason
else:
  print "OK"

首先对异常的属性进行判断,以免出现属性输出报错的现象。

以上,就是对URLError和HTTPError的相关介绍,以及相应的错误处理办法,小伙伴们加油!

Python 相关文章推荐
pycharm 使用心得(三)Hello world!
Jun 05 Python
python实现的jpg格式图片修复代码
Apr 21 Python
使用Python下载歌词并嵌入歌曲文件中的实现代码
Nov 13 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
python3.x 将byte转成字符串的方法
Jul 17 Python
Python GUI布局尺寸适配方法
Oct 11 Python
在Python中通过getattr获取对象引用的方法
Jan 21 Python
如何通过Python实现标签云算法
Jul 02 Python
使用python脚本自动创建pip.ini配置文件代码实例
Sep 20 Python
python pygame实现滚动横版射击游戏城市之战
Nov 25 Python
Python实现队列的方法示例小结【数组,链表】
Feb 22 Python
如何利用Python识别图片中的文字
May 31 Python
介绍Python的Urllib库的一些高级用法
Apr 30 #Python
python插入数据到列表的方法
Apr 30 #Python
Python的Urllib库的基本使用教程
Apr 30 #Python
python获取当前日期和时间的方法
Apr 30 #Python
python实现TCP服务器端与客户端的方法详解
Apr 30 #Python
python排序方法实例分析
Apr 30 #Python
python中lambda与def用法对比实例分析
Apr 30 #Python
You might like
php中随机显示图片的函数代码
2011/06/23 PHP
PHP批量生成图片缩略图的方法
2015/06/18 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
AngularJs bootstrap搭载前台框架——基础页面
2016/09/01 Javascript
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
JS实现的3des+base64加密解密算法完整示例
2018/05/18 Javascript
JavaScript代码调试方法实例小结
2019/01/05 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
vue tab滚动到一定高度,固定在顶部,点击tab切换不同的内容操作
2020/07/22 Javascript
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
[50:02]完美世界DOTA2联赛循环赛 Magma vs IO BO2第一场 11.01
2020/11/02 DOTA
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python中每次处理一个字符的5种方法
2015/05/21 Python
python 统计代码行数简单实例
2017/05/04 Python
深入理解Django中内置的用户认证
2017/10/06 Python
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
Python字符串和正则表达式中的反斜杠('\')问题详解
2019/09/03 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
python 使用cycle构造无限循环迭代器
2020/12/02 Python
伊芙丽官方旗舰店:中国淑女一线品牌
2017/12/01 全球购物
中专生毕业个人鉴定
2014/02/26 职场文书
四风对照检查剖析材料
2014/10/07 职场文书
2015年元旦主持词开场白
2014/12/14 职场文书
安全先进班组材料
2014/12/26 职场文书
公证书格式
2015/01/23 职场文书
奠基仪式致辞
2015/07/30 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
Github 使用python对copilot做些简单使用测试
2022/04/14 Python