立即登录

注册账号

联系我们

2021年12月22日 19:12

16.错误与异常

1. SyntaxError:语法错误 invalid syntax 语法无效

原因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')

2. NameError:

# 引用变量之前,变量并没有定义
print(x)
# 引用函数abc之前,函数abc没有定义
abc('你好')
# 好多情况下是拼写发生错误
def sayhello():
    print('hello,world')
sayheleo() # sayhello拼错了
pirnt('hello,world') # print拼错了

 3. ModuleNotFoundError:

# 引入的包没有安装
import seven

 4. IndentationError:缩进错误

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') #  

5. TypeError:类型错误

# 不同类型的数据进行操作,如数字加字符串
3 + 'a'
# 尝试对数值类型进行索引
123[2]
# 尝试改变不可变元素
a = (0, 1)
a[1] = 3

6. ValueError:值错误

# 进行数据类型转换时,给了错误的值
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进制

7. KeyError: 键错误

# 索引字典时,键不存在
d = {'a':1,'b':2}
d['c'] # 没有c这个键

8. IndexError: 索引错误

# 索引序列时,下标超出索引范围
a = [1,2,3]
a[3]

  9. ZeroDivisionError

# 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

    第一次在课堂上使用,效果还不错。

    回复

给我留言