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()
执行结果:

 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号