目录
(4)try...except...else...finally结构
一、Python中的常见Bug
Bug
- 在程序运行过程中,总会遇到各种各样的错误,而这样的错误被称之为bug。
- 有的错误是程序编写有问题造成的,例如:未声明变量导致程序运行出错,这种错误我们在编写的过程中因为粗心导致的bug,bug是必须修复的。
- 一般情况下,程序无法正常运行就会抛出异常,此时的程序就无法正常执行。
- 在程序发生异常时,我们需要对其进行捕获并且处理它,否则程序会终止执行。
Python中的常见异常
序号 | 异常名称 | 描述 |
1 | ZeroDivisionError | 除(或取模)零(所有数据类型) |
2 | IndexError | 序列中没有此索引(index) |
3 | KeyError | 映射中没有这个键 |
4 | NameError | 未声明/初始化对象(没有属性) |
5 | SyntaxError | Python语法错误 |
6 | ValueError | 传入无效参数 |
示例:
# 数字运算异常: print(10/0) # ZeroDivisionError # 索引范围不在列表中 lst = [11, 22, 33, 44] print(lst[4]) # IndexError # 映射中没有这个键 dic = {'西游记': 12, '红楼梦': 13} print(dic['age']) # KeyError # 未声明/初始化对象(没有属性) print(a) # NameError # Python语法错误 int a = 1 # SyntaxError # 传入无效参数 a = int('hello') # ValueError
二、Bug的常见类型
(1)粗心导致的错误
粗心导致的语法错误SyntaxError
常见的粗心导致的语法错误 :
序号 | 常见粗心导致的语法错误 |
1 | 漏了末尾的冒号,如if语句,循环语句,else子句等 |
2 | 缩进错误,该缩进的没缩进,不该缩进的瞎缩进 |
3 | 把英文符号写成中文符号,比如:逗号,冒号,括号 |
4 | 字符拼接的时候,把字符串和数字拼接在一起 |
5 | 没有定义变量,比如说while的循环条件的变量 |
6 | “==”比较运算符和“=”运算付的混用 |
(2)错误点不熟悉导致错误
索引越界问题IndexError
lst = [11, 22, 33, 44]
print(lst[4])
这个例子中,索引是0~3,而索引为4超出了这个列表的索引范围,故会抛出异常。
通常情况下索引默认从0开始
append()方法的使用掌握不熟练
lst = [ ]
lst = append('A', 'B', 'C')
print(lst)
这个错误点有两处,第一,添加元素,使用lst.append(),第二,append()方法一次只能够添加一个元素 。
(3)思路不清导致错误
在编写程序的过程中不清楚编写程序需要用到的哪些语句语法。
解决方案:
- 使用print()函数
- 使用“#”暂时注释掉有问题的部分代码
(4)被动掉坑
被动掉坑:程序代码没有错,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃
解决方案:Python提供了异常处理机制,可以在异常出现时及时捕获,然后内部“消化”,让程序继续运行 。
三、异常处理机制
异常处理机制:即捕捉异常。
(1)try...except结构
try...except进行捕捉异常 ,try进行程序异常捕捉,except进行异常信息捕获和处理。
当我们认为某些代码可能会出错时,可以使用try来运行这段代码,如果出错,那么后续代码则不会继续执行,直接跳转到except这里。
语法结构:
try:
可能会出错的异常代码
except 异常类型:
异常处理代码
示例:
try:
n1 = int(input('请输入一个整数:'))
n2 = int(input('请输入一个整数:'))
result = n1 / n2
print('结果为:', result)
except ZeroDivisionError:
print('分母不能为0')
(2)try...except...except结构
代码在运行过程中可能出现多种错误,此时应该由不同的except语块去处理。即采用多个except去进行异常捕获。
语法结构:
try:
可能会出错的异常代码
except 异常类型1:
异常处理代码1
except 异常类型2:
异常处理代码2
except ......:
.......
except BaseException:
异常处理代码
示例:
try:
n1 = int(input('请输入一个整数:'))
n2 = int(input('请输入一个整数:'))
result = n1 / n2
print('结果为:', result)
except ZeroDivisionError:
print('分母不能为0')
except ValueError:
print('输入类型应为数字串,而不是字符串')
(3)try...except...else结构
程序在执行过程中,如果没有异常,则执行else语块,否则执行except语块。
语法结构:
try:
可能会出错的异常代码块
except BaseException as e:
异常处理代码块
else:
执行代码块
示例:
try:
n1 = int(input('请输入一个整数:'))
n2 = int(input('请输入一个整数:'))
result = n1 / n2
except BaseException as e:
print('程序出错,出错原因为:', e)
else:
print('计算结果为:', result)
(4)try...except...else...finally结构
无论是否发生异常都会执行最后的代码。
语法结构:
try:
可能会出错的异常代码块
except BaseException as e:
异常处理代码块
else:
执行代码块1
finally:
执行代码块2
示例:
try:
n1 = int(input('请输入一个整数:'))
n2 = int(input('请输入一个整数:'))
result = n1 / n2
except BaseException as e:
print('程序出错,出错原因为:', e)
else:
print('计算结果为:', result)
finally:
print('谢谢您的使用')
(5)traceback模块打印异常
语法结构:
import traceback
try :
可能会出错的异常代码块
except:
traceback,print_exc()
示例:
import traceback
try:
print('--------------------------')
print(12 / 0)
except:
traceback.print_exc()