1 #异常
2
3 #捕获异常
4 #try-except语句
5 #基本语法格式为
6 #try:
7 #
8 #excep[异常类型]:
9 #
10 #注意:
11 #一个try模块可能伴随多个except模块
12 #如果except不指定[异常类型]的话
13 #except就会接收所有异常类型
14
15 importdatetime as dt16 #导入Python内置datetime时间模块并取别名dt
17 defread_date(in_date):18 #建立这个函数的目的是
19 #将导入的字符串格式化成日期
20 try:21 date=dt.datetime.strptime(in_date,"%Y-%m-%d")22 #四位数的年 月份 月内中的一天
23 returndate24 #而这里data的类型也变成了datatime
25 exceptValueError:26 print("处理ValueError异常")27 str_date = "2020-10-24"
28 print("日期={0}".format(read_date(str_date)))29 #所以这里的代码的意思是,将str_date传输给read_date验证并转化成datetime数据
30 #然后再将其返还值输出出来
31 #这里我们写一个错误的数据上去
32 #显然这里的209A不是正确的000——9999的四位数的年
33 #所以这里一定会抛出异常
34 #而且类型还是ValueError类
35 #这就和下面的except相对应了
36 #然后我们看到,直接这里的
37 #print("日期={0}".format(read_date(str_date_2)))
38 #只执行到了 -->这里
39 #而直接输出了"处理ValueError异常"
40 #而再这里执行完毕之后
41 #才继续执行的print("日期={0}".format
42 #但是这时候的read_date(str_date_2)是没有返回值的
43 #所以这个时候返还值就是None
44 str_date_2="209A-10-24"
45 print("日期={0}".format(read_date(str_date_2)))46
47 #我们还可以补充一下
48 #让它能返还异常对象
49 defread_date_2(in_date):50 try:51 date=dt.datetime.strptime(in_date,"%Y-%m-%d")52 returndate53
54 exceptValueError as error:55 #这里的 as error表示将异常对象给e
56 print("处理ValueError异常")57 print(error)58 #然后这里输出error,就会打印出异常对象的异常描述
59 str_date_2="209A-10-24"
60 print("日期={0}".format(read_date_2(str_date_2)))61 #time data '209A-10-24' does not match format '%Y-%m-%d'
62 #比如这里就描述了你这里不符合格式化所填写的格式
63
64 #补充
65 #Python中时间日期的格式化符号
66 '''
67 %y 两位数的年份表示(00-99)68 %Y 四位数的年份表示(000-9999)69 %m 月份(01-12)70 %d 月内中的一天(0-31)71 %H 24小时制小时数(0-23)72 %I 12小时制小时数(01-12)73 %M 分钟数(00=59)74 %S 秒(00-59)75 %a 本地简化星期名称76 %A 本地完整星期名称77 %b 本地简化的月份名称78 %B 本地完整的月份名称79 %c 本地相应的日期表示和时间表示80 %j 年内的一天(001-366)81 %p 本地A.M.或P.M.的等价符82 %U 一年中的星期数(00-53)星期天为星期的开始83 %w 星期(0-6),星期天为星期的开始84 %W 一年中的星期数(00-53)星期一为星期的开始85 %x 本地相应的日期表示86 %X 本地相应的时间表示87 %Z 当前时区的名称88 '''
89
90 print("///")91
92 #多except代码块
93 #还是以上面那个式子为例子
94 defread_date_3(in_date):95 try:96 date=dt.datetime.strptime(in_date,"%Y-%m-%d")97 returndate98
99 exceptValueError as error:100 #这里的 as error表示将异常对象给e
101 print("处理ValueError异常")102 print(error)103 exceptNameError as error:104 #这里的 as error表示将异常对象给e
105 print("处理NameError异常")106 print(error)107 exceptAttributeError as error:108 #这里的 as error表示将异常对象给e
109 print("处理AttributeError异常")110 print(error)111 classshuju(object):112 def __init__(self,t1,t2,t3):113 self.t1=t1114 self.t2=t2115 self.t3=t3116 #先填入一个不存在的str_date_999
117 #print("日期={0}".format(read_date_3(str_date_999)))
118 #当我们输入这个不存在的变量的时候
119 #并没有看到我们想看到的
120 #由 except返还出来的异常
121 #反而是Python本身直接报错了
122 #这是因为我们在使用这个不存在的变量的时候
123 #还来不及进入我们def中的try:后面取
124 #所以不在try中进行检测
125 #自然不会由except进行异常抛出
126 #同理我们再在这里进行测试
127
128 shuju_1=shuju(1,2,3)129 try:130 c=str_date_999131 d=shuju_1.t5132 exceptNameError as error:133 print("处理NameError异常")134 print(error)135 exceptAttributeError as error:136 print("处理AttributeError异常")137 print(error)138
139 #这一组的try和except的组合
140 #将不存在的变量赋值给c
141 #这是在try监视之下的,所以自然会经历except的异常处理
142
143 #同理,我们用except来检测AttributeError也是不行的(本例中)
144 #print("日期={0}".format(read_date_3(shuju_1.t5)))
145 #这样的异常也会在外部被处理掉
146
147 #而我们发现,如果异常返还以后
148 #会直接跳出来
149 #比如上面的代码中c和d的赋值显然两个都是错的
150 #而在执行完c的except之后关于d的就不执行了
151
152 #总结一下
153 #except类似于else,只会执行一个
154 #同时如果try中间的代码块异常,从异常的那行代码开始
155 #后面的try代码块就不会执行了
156
157 #补充
158 #try-except后面可以加上else,类似于while else for else
159 try:160 c=shuju_1.t1161 except : #这里什么都不填,表示所有异常都接收
162 print("有错误")163 else:164 print("放屁,没错误")165
166 #补充2
167 #try-except-finally
168 #在try-except后面补上以后finally
169 #表示虽然在try模块中间因为异常的抛出
170 #导致后面部分代码不能运行,但是我最后还是要运行一遍finally
171 try:172 c=shuju_1.t10173 except : #这里什么都不填,表示所有异常都接收
174 print("有错误")175 else:176 print("放屁,没错误")177 finally:178 print("错了和没错没啥区别,反正要运行我")179 #有错误,不运行else 但是运行了finally
180
181 try:182 c=shuju_1.t2183 except : #这里什么都不填,表示所有异常都接收
184 print("有错误")185 else:186 print("放屁,没错误")187 finally:188 print("错了和没错没啥区别,反正要运行我")189 #没错误,运行了else finally还是运行了
190
191 print("//")