Python的学习(十二):Bug和异常
常见类型
-
粗心导致的语法错误SyntaxError
-
问题:不能将字符串和整数类型作比较。
解决方案:将age字符串类型转换成int类型再进行比较。
-
while i<10:
print(i)
问题:没有设置初始值和使用了中文括号还有没有设置循环结束标记。
解决方案:
i = 0 while i < 10: print(i) i ++
-
-
知识点不熟练导致的错误
-
索引越界
索引是从0开始的!
-
append()方法使用不熟练
改成lst.append(‘A’),每次只能添加一个元素。
-
-
思路不清晰
修改后:
name = input('请输入你想要查询的演员:') for item in lst:#遍历列表 item是一个又一个字典 act_lst = item['actors'] for actor in act_lst: if name in actor: print(name,'出演了',item['title'])
异常处理机制
被动掉坑:
程序的代码逻辑没有错误,只是因为用户错误错做或者一些例外情况而导致的程序崩溃
例子:输入两个整数并进行除法运算
a = int(input('请输入第一个整数'))
b = int(input('请输入第二个整数'))
result = a/b
print('结果是:',result)
#1.不小心输入了错误的字符串会导致强制转换整数出错 比如输入q
#2.输入分母为0会导致出错
try—except
解决办法:使用异常处理机制,可以在异常出现的时候进行捕获,然后内部消化,让程序继续运行。
修改后:
-
try: a = int(input('请输入第一个整数')) b = int(input('请输入第二个整数')) result = a/b print('结果是:',result) except ZeroDivisionError: print('对不起,除数不允许为0!') print('程序结束')
-
多个except结构
捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能的异常,可以在最后增加BaseException
try—except—else
如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块。
try:
n1 = int(input('请输入第一个整数'))
n2 = int(input('请输入另一个整数'))
result = n1/n2
except BaseException as e:
print('出错了')
print(e)
else:
print('结果为:',result)
try—except—else—finally
finally块无论是否发生异常都会被执行,通常用来释放try块中申请的资源
try:
n1 = int(input('请输入第一个整数'))
n2 = int(input('请输入另一个整数'))
result = n1/n2
except BaseException as e:
print('出错了')
print(e)
else:
print('结果为:',result)
finally:
print('谢谢使用!')
print('程序结束!')
常见的异常类型
-
ZeroDivisionError
除或(取模)零(所有数据类型)
print(10/0)
-
IndexError
序列中没有该索引
lst = [0,1,2] print(lst[3])
-
KeyError
映射中没有这个键
dic = {'name':'张三'} print(dic['age'])
-
NameError
未声明/初始化对象(没有属性)
print(num)
-
SyntaxError
Python语法错误
int a = 20
-
ValueError
传入无效的参数
a = int('hello')
traceback模块的使用
打印异常的信息
import traceback
try:
print('--------------')
print(1/0)
except:
traceback.print_exc()