原因1:流程控制语句没有加冒号;
# 原因1:流程控制语句没有加冒号;
a = 0
if a > 3
print('ok')
原因2:同一行代码出现多个语句
# 原因2:同一行代码出现多个语句
a = 0 b = 1
原因3:括号不匹配,注意:可能不会精确的指到错误位置!!
# 原因3:括号不匹配,注意:可能不会精确的指到错误位置!!
print(3*(3+4)+4)+5)
原因4:中文标点
# 原因4:中文标点
a = 0
if a > 3:
print('ok')
# 引用变量之前,变量并没有定义
print(x)
# 引用函数abc之前,函数abc没有定义
abc('你好')
# 好多情况下是拼写发生错误
def sayhello():
print('hello,world')
sayheleo() # sayhello拼错了
pirnt('hello,world') # print拼错了
# 引入的包没有安装
import seven
unexpected indent 意外的缩进.
可以是任意空格数,但是编码规范中要求必须是4个空格,且不能用Tab键来缩进
(编辑器会把tab变成4空格,有些编辑器例外)
a = 0
if a > 4:
print('ok') # 4个空格
if a > 5:
print('ok') # 5个空格,不规范,但不会报错
a = 0
if a > 4:
print('ok') # 4个空格
if a > 5: # 5个空格,同级空格不同,unexpected indent
print('ok') #
# 不同类型的数据进行操作,如数字加字符串
3 + 'a'
# 尝试对数值类型进行索引
123[2]
# 尝试改变不可变元素
a = (0, 1)
a[1] = 3
# 进行数据类型转换时,给了错误的值
int('a')
# 进行进制之间的转换,如果进制或字符串填写不正确,都会发生类型错误
int('0xff',16) # 16进制转10进制
int('0o77',8) # 8进制转10进制
int('0b11001',2) # 2进制转10进制
bin(25) # 10进制转2进制
oct(63) # 10进制转8进制
hex(255) # 10进制转16进制
# 索引字典时,键不存在
d = {'a':1,'b':2}
d['c'] # 没有c这个键
# 索引序列时,下标超出索引范围
a = [1,2,3]
a[3]
# ZeroDivisionError
1/0
总结: 发生错误后,后继的代码就不能正常运行了,但是我们用try except模块来捕获异常,让代码虽发生错误,但是能继续执行.
# 前面发生了错误,后面的代码无法正常运行
1/0
print('ok') # 不会执行
#异常捕获的方式,让代码虽然有错,但还行继续运行.
try:
1/0
except:
print('发生一些错误.')
print('ok') # 会正常打印
但是,要注意,捕获异常不能捕获SyntaxError和IndentationError,如
# 语法错误会发生什么? 异常捕获并不能捕获
try:
a = 0 b = 1
except:
print('发生一些错误.')
print('ok') # 并不会正常打印
可以指定单独捕获某种类型的错误,如
# except后面什么都不加,可以捕获所有异常
# 如果想捕获某一种类型的异常,要使用 except 错误类型,比如
try:
1 / 0
except NameError: # 只能捕获NameError
print('ok1') # 不会打印,try中发生的是ZeroDivisionError
except ValueError: # 可以加多个
print('ok2') # 同样不会打印
except ZeroDivisionError:
print('ok3') # 会打印
except: # 如果有不加错误类型的,必须要放到最后
print('ok4') # 如果前面已经捕获到,这个不会执行,除非前面都没捕获到
finally:
print('ok5') # 会打印,并且不管上面有没有捕获到都会打印
最后, 在很多情况下,我们会主动抛出异常
try:
# 主动抛出异常
raise NameError('这个是我主动抛出的异常')
except NameError:
# 主动抛出的异常,仍然会被捕获到
print('抛出的异常被我捕获到了!')
留言
石小磊的评论:
第一次在课堂上使用,效果还不错。
石小磊
2021年11月25日 09:13第一次在课堂上使用,效果还不错。
回复