对于异常捕获这词,说白了就是程序运行了,然后出错了,为什么出错呢,通过异常捕获来抓取错误原因。我更倾向于去将异常跳过去,然后程序接着执行;因为读取几百万非结构数据,里面存在太多可能性了,所以干脆将少部分可能出现错误的数据直接跳过,然后接着执行代码;
这里我先放一个小例子看一下:
a=10
useful=[]
d=[1,2,0,4,1,2,0]
for i in d:
try:
c=a/i
print (c)
except Exception as e:
try:
c=a/0
print(c)
except Exception as e:
continue
useful.append(i)
print(useful)
执行结果:
10.0
5.0
2.5
10.0
5.0
[1, 2, 4, 1, 2]
这里我首先设置了一个被除数10 然后设置了一个list中包含所有的除数,但是其中有一些是0作为了分母,这样程序会出错,我的目的就是程序出错了跳过,接着执行下面的代码,然后出错那就这次循环结束,直接进行下一次循环;这样尽管i=0时候c=a/i出错了,然后执行c=a/0
还是出错了,那我直接continue跳出本次循环,下面代码不执行了;
这里我将够做分母的数字最后都打印了出来,看到0并没有写入到list中。
下面我将continue改为pass
a=10
useful=[]
d=[1,2,0,4,1,2,0]
for i in d:
try:
c=a/i
print (c)
except Exception as e:
try:
c=a/0
print(c)
except Exception as e:
pass
useful.append(i)
print(useful)
运行结果:
10.0
5.0
2.5
10.0
5.0
[1, 2, 0, 4, 1, 2, 0]
这里可以看到最后的list中包含了0,也就是说pass的作用就是即便是程序出现了错误,也同样可以执行接下来的代码。
再看一种新的情况:
a=10
useful=[]
d=[1,2,0,4,1,2,0]
for i in d:
try:
c=a/i
print (c)
except Exception as e:
try:
c=a/0
print(c)
except Exception as e:
print(e)
else:
useful.append(i)
print(useful)
运行结果:
10.0
5.0
division by zero
2.5
10.0
5.0
division by zero
[1, 2, 4, 1, 2]
这里可以看到我将pass去掉了,然后在最后加上了else方法,这里else是另外一种pass,即只有在程序没有出现错误的情况下才会去执行else的方法。
以上就是异常捕获的内容,另外我们还可以将出现问题数据的异常都捕获到,然后写到txt或者数据库当中。
if losttitle:
try:
title_obj = re.search(pattern2, content)
get_full_title=title_obj.group()
# print(get_full_title)
except Exception as e:
error=str(e)
error_id = str(id)
print(error)
cmd = 'INSERT INTO 提取ID失败信息 (ERRORTYPE,ID) VALUES("%s","%s")'%(error,error_id)
# f.write('错误类型:'+error+';'+'错误结果ID:' + aa + "\n")
# cmd = "update 标讯测试1万 set name= '%s' where id = '%s' " % (get_full_title,id)
insert_into_MySQL(connect_insert, cursor_insert, cmd)
上面这个代码就是我写的将异常写入数据库中。
先说一下程序运行背景,首先数据库中有几百万的html格式文件,我要将其抽取正文,问题是有一些html文件格式奇葩,因此目前的抽取正文代码只能够抽取95%的数据,有一些数据会出现错误,我就想捕获那些出现错误的html对应的id和错误类型。
这里代码非常简单,就是将异常as e然后转换为str格式,写入数据库。
浅析Python异常处理 这个地址中的异常处理写的也挺通俗的,有空可以看看~~
PS:
最近在用nlkt做文法分析,可是自己电脑import nltk就是有错误,在别人电脑就没有,查看了各种库的版本都没有问题,到底出现在哪了了,没办法只能从程序运行的错误中查找,给了一堆导入错误,我就一个一个看,看到最后一个导入错误时候发现程序中由于存在异常所以导入不正确,这里我就在nltk那个模块中将异常这跳过了,然后程序就能跑了,哈哈哈哈。。。。
这里还是要总结一下,因为在源代码中作者其实是给出了一个异常跳过的try,可是又发现了一个新的异常,还要同时将这两个异常跳过去,搜搜一番一篇博文看到他写的不错,
except: 捕捉所有(其他)异常类型
except name: 只捕捉特定的异常
except name,value: 捕捉所有的异常和其额外的数据(或实例)
except (name1,name2) 捕捉任何列出的异常
except (name1,name2),value: 捕捉任何列出的异常,并取得其额外数据
else: 如果没有引发异常,就运行
finally: 总是会运行此代码块,无论是否发生异常
except:用在想不到异常情况,在except:前面可以定义可以想到的异常:except name1: except name2:
这里多个异常时候直接用括号括起来就行了,他还有其他关于异常的一些总结,可以看下面:Python学习笔记整理(十七)异常处理-diege-51CTO博客blog.51cto.com
博文名称:Python学习笔记整理(十七)异常处理
写的还是蛮不错的。