csatblogspotdotcom

Friday, January 13, 2017

Python exception的一个小问题

最近编写了一个小程序去爬某网站,挨个挨个ID查询信息,各种异常exception考虑了,但这段时间发现运行一段时间之后就停住了,进程还在,但是从网卡状态看就不再有像心跳一样的网络请求了,Linux用top命令显示的CPU占用率也为0了,log里面也停住了,仔细检查,怀疑是except语句没理解透:except **** as ****:之后就是else:语句了,之前想当然的把else认为是包含except **** as ****:这种情况之外的所有情况,但实际上是没有异常的情况,正确的语句应该是: try: **** except **** as ****:(捕获某个异常) **** except:(之前就是缺少了这个部分) ****(捕获某个异常之外的所有未知异常) else:(正常情况,即无异常的情况) **** 加上except:这个部分后继续运行程序 之前程序卡主估计是出现了未知异常没有被捕获,这个异常又不能像error一样被抛出使程序停止运行,程序就卡在了那里 另外附上exception相关类的关系: https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy


后记20170117:
今天程序又停了,回来仔细观察了下,在可能有问题的地方都加了logging,另外注意到每次出现这种情况的时候,再手动去访问网站,都是未登录的,说明cookie过期了,但直接使用过期的cookie是能够得到一个页面显示的,说明是另一种情况,即是cookie使用过程中过期(而不是一开始就过期),那么怀疑到是timeout相关设置,于是注意到一个地方:opener.open的时候,是否有超时?一查果然默认timeout为无限制,就是说会永远超时下去,_GLOBAL_DEFAULT_TIMEOUT=object(),是空的。

于是加上了timeout=30:response = opener.open(request, timeout=30) ,其实共有3中方法设置超时:

import socket              #method 1 to set timeout
socket.setdefaulttimeout(0.01)

urllib2.socket.setdefaulttimeout(0.01) #method 2

response = opener.open(request, timeout=10) #method 3
接下来再试试

Labels: , , ,

0 Comments:

Post a Comment

Subscribe to Post Comments [Atom]

<< Home