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("//////////////////////////////////////")