【python学习】——BUG

一、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、异常处理机制
  • 1. try…except…结构

单个或多个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)
  • 2. try…except…else 结构

如果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
  • 3. try…except…else…finally 结构

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块中均会被执行
  • 4.python常见的异常类型
序号异常类型描述
1ZeroDivisionError除(或取模)零(左右数据类型)
2IndexError序列中没有此索引(index)
3KeyError映射中没有这个键
4NameError未声明/初始化对象(没有属性)
5SyntaxErrorpython语法错误
6ValueError传入无效的参数
- 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'
  • 5.traceback模块

使用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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是肉球哇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值