Python基础语法06--常见Bug类型和异常处理

目录

一、Bug的常见类型

1、粗心导致的语法错误 SyntaxError

粗心导致错误的自查宝典

2、知识不熟练导致的错误

知识点不熟悉导致错误的自查宝典:练,练,练,多练习

3、思路不清导致的问题解决方案

4、被动掉坑

二、python的异常处理机制

1、异常处理机制

1)单个except异常处理的语法:

 2)多个except结构语法:

3)try……except……else结构

4)try……except……else……finally结构

2、python中常见的异常类型

3、traceback模块

4、总结


一、Bug的常见类型

1、粗心导致的语法错误 SyntaxError

如:input()函数返回的是str类型,str类型不能直接与int类型进行比较

# input()函数返回的是str类型,str类型不能直接与int类型进行比较
age = input('请输入年龄:')
if age > 10:   # 报错 TypeError: '>' not supported between instances of 'str' and 'int'
    print(age)

 

如:变量未初始化,循环处理未自增

# 变量未初始化,循环处理未自增
while i < 10:  # NameError: name 'i' is not defined
    print(i)

 

如:if的条件判断表达式,错误使用了赋值符号=,应该要使用==判断是否相等;

# if的条件判断表达式,错误使用了赋值符号=
uname = input("name:")
pwd = input("password:")

if uname = 'test' and pwd = 'test':  # SyntaxError: invalid syntax
    print('用户登录成功')

 

粗心导致错误的自查宝典

  • 漏了末尾的冒号,如if语句,循环语句,else子句等;
  • 缩进错误,该缩进的没缩进,不该缩进的瞎缩进;
  • 英文符号写成中文符号,比如:引号,冒号,括号;
  • 字符串拼接的时候,把字符串和数字拼在一起;
  • 没有定义变量,比如while的循环条件的变量;
  • ==比较运算符和=赋值运算符的混用;

 

2、知识不熟练导致的错误

如:索引越界问题IndexError

# 索引越界问题IndexError
lst = [10, 20, 30]
print(lst[3])  # IndexError: list index out of range

 

如:append()方法的使用掌握不熟练

# append()方法只能添加一个元素
lst = [10, 20, 30]
lst = append(40)  # 写法错误,应该为lst.append(40),报错NameError: name 'append' is not defined
lst.append(40,50)  # 只能添加一个元素, 报错TypeError: append() takes exactly one argument (2 given)

 

知识点不熟悉导致错误的自查宝典:练,练,练,多练习

 

3、思路不清导致的问题解决方案

  • 问题前后,使用print()函数,打印变量输出
  • 使用#暂时注释部分代码
# 输入演员名字,显示出演了哪部电影
lst = [{'rating': [9.7, 1], 'id':'1001', 'type': ['犯罪', '剧情'], 'title':'我和我的家乡', 'actors': ['葛优', '黄渤', '范伟', '邓超']},
       {'rating': [8.7, 2], 'id':'1002', 'type': ['爱情', '剧情'], 'title':'夺冠', 'actors': ['巩俐', '黄渤', '吴刚']},
       {'rating': [7.7, 3], 'id':'1003', 'type': ['悬疑', '剧情'], 'title':'姜子牙', 'actors': ['郑希', '杨凝']}]
name = input('请输入演员姓名:')
count = 0
for movie in lst:
    for actor in movie['actors']:
        if name == actor:
            print("演员: ", name ,", 出演了电影:", movie['title'], ", 豆瓣评分:", movie['rating'][0])
            count += 1

if count == 0:
    print('演员: ', name, '没有电影作品。')
elif count > 0:
    print('演员: ', name, '出演了', count, "部电影")
else:
    print('出现了不可预期的异常')

输出结果:

请输入演员姓名:黄渤
演员:  黄渤 , 出演了电影: 我和我的家乡 , 豆瓣评分: 9.7
演员:  黄渤 , 出演了电影: 夺冠 , 豆瓣评分: 8.7
演员:  黄渤 出演了 2 部电影

 

4、被动掉坑

  • 程序代码逻辑没有错误,只是因为用户错误操作或者一些“例外情况”而导致的程序崩溃;

 

如:除法计算器,未做输入非整数判断,未做被除数为0时的判断;

# 除法计算器
x = input('请输入除数:')
y = input('请输入被除数:')

# 未做被除数为0时的判断,报错:ZeroDivisionError: division by zero
# 未做输入非整数判断,报错:ValueError: invalid literal for int() with base 10: 'a'
result = int(x)/int(y)  
print('结果是:', result)

 

二、python的异常处理机制

  • 在异常出现时即时捕获,内部“消化”,让程序继续运行;

 

1、异常处理机制

1)单个except异常处理的语法:

try:
    可能会出异常的代码

except 异常类型:
    异常处理代码(报错后执行的代码)

 

 2)多个except结构语法:

  • 捕获异常的顺序,按照先子类后父亲类的顺序;
  • 为了避免遗漏可能出现的异常可以在最后增加BaseException
try:
    可能会出异常的代码

except Exception1:
    异常处理代码

except Exception2:
    异常处理代码

except BaseException:
    异常处理代码

 

# 除法计算器
try:
    x = input('请输入除数:')
    y = input('请输入被除数:')
    result = int(x)/int(y)
    print('结果是:', result)

except ZeroDivisionError:
    print('除数不能为0')

# except ValueError:
#     print('不能输入非数字')

except BaseException as e:
    print(e)  # 输入非数字后,显示报错信息:invalid literal for int() with base 10: 'a'
print('程序结束')

输出结果:执行完异常输出后,程序继续运行,输出“程序结束”

请输入除数:a
请输入被除数:2
invalid literal for int() with base 10: 'a'
程序结束

 

3)try……except……else结构

  • 如果try块中没有抛出异常,则执行else块;
  • 如果try块中抛出异常,则执行except块;

 

# 除法计算器
try:
    x = input('请输入除数:')
    y = input('请输入被除数:')
    result = int(x)/int(y)
except BaseException as e:
    print('出错了,', e)
else:
    print('结果是:', result)
print('程序运行结束')

输出结果1:

请输入除数:10
请输入被除数:2
结果是: 5.0
程序运行结束

输出结果2:

请输入除数:a
请输入被除数:3
出错了, invalid literal for int() with base 10: 'a'
程序运行结束

 

4)try……except……else……finally结构

  • finally块,无论是否发生异常,都会被执行,常用来释放try块中申请的资源;
# 除法计算器
try:
    x = input('请输入除数:')
    y = input('请输入被除数:')
    result = int(x)/int(y)
except BaseException as e:
    print('出错了,', e)
else:
    print('结果是:', result)

finally:
    print('无论是否发生异常,都会被执行的代码')
print('程序运行结束')

输出结果1:

请输入除数:10
请输入被除数:2
结果是: 5.0
无论是否发生异常,都会被执行的代码
程序运行结束

输出结果2:

请输入除数:a
请输入被除数:3
出错了, invalid literal for int() with base 10: 'a'
无论是否发生异常,都会被执行的代码
程序运行结束

 

2、python中常见的异常类型

ZeroDivisionError除(或取模)零(所有数据类型)
IndexError序列中没有此索引(index)
KeyError映射中没有这个键
NameError未声明/未初始化对象(没有属性)
SyntaxErrorPython语法错误
ValueError传入无效的参数

 

 

 

 

3、traceback模块

  • 使用traceback模块打印异常信息
# traceback模块打印异常日志
import traceback
try:
    num = 10/0
except:
    print('-------这是traceback模块打印的信息-------')
    traceback.print_exc()

输出结果:

-------这是traceback模块打印的信息-------
Traceback (most recent call last):
  File "D:/Nikey/Python/PyCharm/basicProgram/basic/tmp.py", line 4, in <module>
    num = 10/0
ZeroDivisionError: division by zero

 

4、总结

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值