• 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("//////////////////////////////////////")
    悟已往之不谏,知来者之可追
  • 相关阅读:
    新数学丛书《连分数》 习题 1.1
    连分数中一个有意思的小玩意儿
    无聊博文之:用同余的语言阐述欧几里德算法
    有向无环图
    Codeforces Round #658 (Div. 2)
    常用代码模板3——搜索与图论
    什么是动态规划?动态规划的意义是什么?(转自知乎)
    Codeforce:4C. Registration system (映射)
    C++与正则表达式入门
    常用代码模板4——数学知识
  • 原文地址:https://www.cnblogs.com/ljh-study/p/13872192.html
Copyright © 2020-2023  润新知