zoukankan      html  css  js  c++  java
  • Python学习系列之常见错误TypeError,try...except...finally等异常处理机制(二十二)

    Bug的由来及分类

    一、Bug的常见类型

    1. 粗心导致的语法错误SyntaxError

    (1) 数据类型错误

    示例代码:

    age=input('请输入你的年龄:')
    if age>=18:
        print('成年人....')
    

      执行结果:执行报TypeError: '>' not supported between instances of 'str' and 'int',提示类型错误

      说明:age=input()得到的是string类型,18的类型是int类型,两者无法比较,所以会报TypeError,此时就需要将age转换成int类型,然后再和18比较

    正确代码如下:

    age=input('请输入你的年龄:')
    print(type(age))
    if int(age)>=18:
        print('成年人....')
    

      执行结果:

    2. 常见语法错误

    #语法错误
    while i<10:
        print(i)
    

      说明:代码中有2个错误,一是没有定义 i 的值,应该要给 i 定义一个初始值,二是pint函数后面的括号是中文括号,应该要改成英文括号,于是改成:

    i=0
    while i<10:
        print(i)
    

      执行以上代码会发现进入了死循环,i一直是0,会一直执行while函数一直打印0,应该要设置一个函数退出条件,在最后加上 i+=1

    i=0
    while i<10:
        print(i)
        i+=1
    

      执行结果如下:

     (3)粗心导致的语法错误,将 == 写成 = 

      

    Bug的常见错误

      错误自查宝典:

      1.漏了末尾的冒号,如if语句,循环语句,else子句等

      2.缩进错误,该缩进的没缩进,不该缩进的瞎缩进

      3.把英文符号写成中文符号,比如说:引号,冒号,括号

      4.字符串拼接的时候,把字符串和数字拼在一起

      5.没有定义变量,比如说while 的循环条件的变量

      6.“==”比较运算符和“=”赋值运算符的混用

    练习:豆瓣电影Top250排行,使用列表存储电影信息,要求输入名字在屏幕上显示xxx出演了哪部电影

    '''豆瓣电影Top250排行,使用列表存储电影信息,
    要求输入名字在屏幕上显示xxx出演了哪部电影'''
    lst=[{'rating':[9.7,50],'id':'1292052','type':['犯罪','剧情'],'title':'肖申克的救赎','actors':['蒂姆.罗宾斯','摩根.弗里曼']},
         {'rating':[9.6,50],'id':'1291546','type':['爱情','剧情'],'title':'霸王别姬','actors':['张国荣','张丰毅','巩俐','葛优']},
         {'rating':[9.6,50],'id':'1296141','type':['犯罪','剧情'],'title':'控方证人','actors':['泰隆.鲍华','玛琳.黛德丽']}]
    
    name=input('请输入演员名字:')
    for movie in lst:
        # print(movie)
        actor=movie['actors']
        # print(actor)
        for item in actor:
            # print(item)
            if item==name:
                print(name,'出演了',movie['title'])
    

      执行结果:

      

    练习:输入两个整数并进行除法运算

    '''要求输入2个整数并进行除法运算'''
    try:
        a=int(input('请输入一个整数:'))
        b=int(input('请再输入一个整数:'))
        print(a,type(a))
        print(b,type(b))
        print(a/b)
    except ZeroDivisionError:
        print('除数不能为0哦!!!')
    print('程序结束')
    

      执行结果:

     优化:当输入字符串时,提示只能输入数字

    '''要求输入2个整数并进行除法运算'''
    try:
        a=int(input('请输入一个整数:'))
        b=int(input('请再输入一个整数:'))
        print(a,type(a))
        print(b,type(b))
        print('结果为:',a/b)
    except ZeroDivisionError:
        print('除数不能为0哦!!!')
    except ValueError:
        print('只能输入数字')
    print('程序结束')
    

      执行结果:

     Pyton的异常处理机制

     1. try...except...else结构

    • 如果try块中没有抛异常,则执行else块,如果try中抛出异常,则执行except块

     代码举例:

    输入2个数字,对输入的两个数字进行相除

    try:
        a=int(input('请输入一个整数:'))
        b=int(input('请再输入一个整数:'))
        res=a/b
    except BaseException as e:
        print('出错了')
        print(e)
    else:
        print('结果为:',res)
    

      执行结果:

           

     2. try...except...else...finally结构

    • finally块无论是否发生异常都会被执行,能常用来释放try块中申请的资源

    图形示意图如下,无论是执行except或else,都会执行finally

      

    '''try...except...else...finally结构
        无论是执行except还是else,都会执行finally
    '''
    try:
        a=int(input('请输入一个整数:'))
        b=int(input('请再输入一个整数:'))
        res=a/b
    except BaseException as e:
        print('出错了')
        print(e)
    else:
        print('结果为:',res)
    finally:
        print('感谢使用')
    

      执行结果:

         

     Python中常见的异常类型

     

      

       代码举例:

    • ZeroDivisionError举例
    a=int(input('请输入一个整数:'))
    b=int(input('请再输入一个整数:'))
    res=a/b
    

      执行结果:

    • IndexError举例
    '''没有索引错误'''
    lst=[11,22,33]
    print(lst[4])
    

      执行结果:

    •  KeyError举例
    '''映射中没有这个值'''
    dic={'name':'张三','age':20}
    print(dic['gender'])
    

      执行结果:

    •  NameError举例:
    print(name)
    

      执行结果:

    •  SyntaxError举例
    '''SyntaxError举例'''
    int a=20
    

      执行结果:

     ValueError举例:

    '''ValueError举例'''
    a=int('hello')
    

      执行结果:

    traceback模块

    • 使用traceback模块打印异常信息

    当程序出现错误时,Python中默认使用Traceback进行日志打印,如下图

     当然需要我们手动错误信息记录到日志文件时,需要手动处理traceback

    import traceback
    try:
        print('-------------------')
        print(10/0)
    except:
        traceback.print_exc()
    

      执行结果:

  • 相关阅读:
    scp 跨服务器传数据
    Mongo启动失败解决方案
    centos7 NET模式配置虚拟机
    centos7虚拟机配置桥接模式
    Linux centos7 查看cpu 磁盘 内存使用情况
    centos7修改时间和时区
    fiddler培训
    docker学习笔记
    docker-ce安装官翻
    Nginx+Tomcat简单负载均衡
  • 原文地址:https://www.cnblogs.com/wx170119/p/14456919.html
Copyright © 2011-2022 走看看