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

  执行结果:

原文地址:https://www.cnblogs.com/wx170119/p/14456919.html