一、BUG的由来
1、Bug的由来及分类
bug是臭虫的意思,是因为世界上第一部万用计算机的使用过程中遇到故障,发现是因为有一只虫子在上面引起的故障,所有后来将不能正常运行的程序称为bug
debug称为排除故障
2、不同异常类型的处理方式
(1)bug的常见类型
- SyntaxError:粗心导致的错误
粗心导致的语法错误:SyntaxError,自查宝典如下
(1)漏了末尾的冒号,如if语句,循环语句,else子句等
(2)缩进错误,该缩进的没有缩进,不该缩进的瞎缩进
(3)把英文符号写成中文符号,比如:引号,冒号,逗号,括号
(4)字符串拼接的时候,把字符串和数字拼在一起
(5)没有定义变量,比如说while的循环条件的变量
(6)“==”比较运算符和“=”赋值运算符的混用
- IndexError:知识不熟练导致的错误
知识不熟练导致的错误:
只能多 练!练!!练!!!练!!!!练!!!!!
- 思路不清晰导致的问题
(1)使用print()函数
(2)使用“#”暂时注释部分代码
- 被动掉坑
- 被动掉坑:程序代码逻辑没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃
- 解决方案:python提供了异常处理机制,可以在异常出现时及时捕获,然后内部“消化”,让程序继续运行
3、异常处理机制
单个或多个except结构
- 为捕获异常的顺序按照先子类后父类的顺序,为了避免遗漏可能出现的异常,可以在最后增加BaseException
try:
n1=int(input("请输入一个整数:"))
n2=int(input("请输入另外一个整数"))
result=n1/n2
print("整除结果为:",result)
except ZeroDivisionError:
print("除数不能为0哦!")
except ValueError:
print("不能将字符串转换为数字")
except BaseException as e:
print(e)
如果try块中没有抛出异常,则执行else块,如果try中抛出异常,则执行except块
try:
n1=int(input("请输入一个整数:"))
n2=int(input("请输入另外一个整数"))
result=n1/n2
print("整除结果为:",result)
except BaseException as e:
print("出错了")
print(e)
else:
print("结果为:",result)
出错情况一:
请输入一个整数:10
请输入另外一个整数0
出错了
division by zero
出错情况二:
请输入一个整数:q
出错了
invalid literal for int() with base 10: 'q'
正常情况:
请输入一个整数:10
请输入另外一个整数10
整除结果为: 1.0
结果为: 1.0
finally块无论是否发生异常都会被执行,常用来释放try块中申请的资源
try:
n1=int(input("请输入一个整数:"))
n2=int(input("请输入另外一个整数"))
result=n1/n2
print("整除结果为:",result)
except BaseException as e:
print("出错了")
print(e)
else:
print("结果为:",result)
finally:
print("无论是否产生异常,总会被执行的代码")
print("程序结束")
正常情况:
请输入一个整数:10
请输入另外一个整数20
整除结果为: 0.5
结果为: 0.5
无论是否产生异常,总会被执行的代码
程序结束
异常情况一:
请输入一个整数:10
请输入另外一个整数0
出错了
division by zero
无论是否产生异常,总会被执行的代码
程序结束
异常情况二:
请输入一个整数:10
请输入另外一个整数q
出错了
invalid literal for int() with base 10: 'q'
无论是否产生异常,总会被执行的代码
程序结束
由以上三种情况可以看出,无论什么情况,finally块中均会被执行
序号 | 异常类型 | 描述 |
---|---|---|
1 | ZeroDivisionError | 除(或取模)零(左右数据类型) |
2 | IndexError | 序列中没有此索引(index) |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明/初始化对象(没有属性) |
5 | SyntaxError | python语法错误 |
6 | ValueError | 传入无效的参数 |
- 1.“ZeroDivisionError”
print(20/0)
ZeroDivisionError: division by zero
- 2.“IndexError”
lst=[1,2,3,4]
print(lst[5])
IndexError: list index out of range
- 3.“KeyError”
dic={"name":"张三","age":"18"}
print(dic[dic['aas']])
KeyError: 'aas'
- 4.“NameError”
print(num)
NameError: name 'num' is not defined
- 5.“SyntaxError”
int a=20
SyntaxError: invalid syntax
- 6.“ValueError”
a=int("hello")
ValueError: invalid literal for int() with base 10: 'hello'
使用traceback模块打印异常信息
案例一:
print(20/0)
反馈结果:
Traceback (most recent call last):
File "D:/02.练习/01/main.py", line 2, in <module>
print(20/0)
ZeroDivisionError: division by zero
在这里,直接可以显示出Traceback的相关结果,当然,也可以自己来调用,就需要import Traceback即可
案例二:
import traceback
try:
print("-------------------------")
print(9/0)
except:
traceback.print_exc()
反馈结果:
Traceback (most recent call last):
File "D:/02.练习/01/main.py", line 4, in <module>
print(9/0)
ZeroDivisionError: division by zero
-------------------------
我们发现,这里的“---------”在后面,但是继续运行一次,就会在前面,原因是线程相关的问题
Traceback (most recent call last):
-------------------------
File "D:/02.练习/01/main.py", line 4, in <module>
print(9/0)
ZeroDivisionError: division by zero
4、PyCharm的调试模式
- 断点
程序运行到此处,暂时挂起,停止执行。此时可以详细观察程序的运行情况,方便做出进一步的判断
- 进入调试视图
进入调试试图的三种方式
(1)单击工具栏上的“小甲虫”按钮
(2)右击编辑区,点击debug‘模块名’
(3)快捷键:shift+F9