Python基础23 捕获异常 try-except

  1 #异常
  2 
  3 #捕获异常
  4 #try-except语句
  5 #基本语法格式为
  6 #try:
  7 #   <可能会抛出异常的语句>
  8 #excep[异常类型]:
  9 #   <处理异常>
 10 #注意:
 11 #一个try模块可能伴随多个except模块
 12 #如果except不指定[异常类型]的话
 13 #except就会接收所有异常类型
 14 
 15 import datetime as dt
 16 #导入Python内置datetime时间模块并取别名dt
 17 def read_date(in_date):
 18     #建立这个函数的目的是
 19     #将导入的字符串格式化成日期
 20     try:
 21         date=dt.datetime.strptime(in_date,"%Y-%m-%d")
 22         #                                  四位数的年    月份 月内中的一天                            
 23         return date
 24                 #而这里data的类型也变成了datatime 
 25     except ValueError:
 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 def read_date_2(in_date):
 50     try:
 51         date=dt.datetime.strptime(in_date,"%Y-%m-%d")                            
 52         return date
 53                 
 54     except ValueError 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 def read_date_3(in_date):
 95     try:
 96         date=dt.datetime.strptime(in_date,"%Y-%m-%d")                            
 97         return date
 98                 
 99     except ValueError as error:
100         #这里的 as error表示将异常对象给e
101         print("处理ValueError异常")
102         print(error)
103     except NameError as error:
104         #这里的 as error表示将异常对象给e
105         print("处理NameError异常")
106         print(error)
107     except AttributeError as error:
108         #这里的 as error表示将异常对象给e
109         print("处理AttributeError异常")
110         print(error)
111 class shuju(object):
112     def __init__(self,t1,t2,t3):
113         self.t1=t1
114         self.t2=t2
115         self.t3=t3
116 #先填入一个不存在的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_999
131     d=shuju_1.t5
132 except NameError as error:
133     print("处理NameError异常")
134     print(error)
135 except AttributeError 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.t1
161 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.t10
173 except :            #这里什么都不填,表示所有异常都接收
174     print("有错误")
175 else:
176     print("放屁,没错误") 
177 finally:
178     print("错了和没错没啥区别,反正要运行我")
179 #有错误,不运行else 但是运行了finally
180 
181 try:
182     c=shuju_1.t2
183 except :            #这里什么都不填,表示所有异常都接收
184     print("有错误")
185 else:
186     print("放屁,没错误") 
187 finally:
188     print("错了和没错没啥区别,反正要运行我")
189 #没错误,运行了else finally还是运行了
190 
191 print("//////////////////////////////////////")

 

posted @ 2020-10-25 09:01  想活出点人样  阅读(370)  评论(0编辑  收藏  举报