Python异常

253 阅读3分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

第一部分:::异常

注意:当代码出现了异常,后面的代码都不会执行。
异常本身是类

小知识点:
在 Python 中所有的异常都是继承自 BaseException

直接分为四大类:
SystemExit:Python退出异常
KeyboardInterrupt: 键盘打断(Ctrl+C)
GeneratorExit: 生成器退出
Exception: 普通异常(只会使用这部分的异常)

第二部分:::异常处理

(1)基本的try...except...

举例子:

try:
    print(11)       # 这是正确的,会打印出来
    print(a)        # a没定义,所以会出现异常
    print(22)       # 因为上面一句出现了异常,所以即使这句是正确的,也不会打印
except:
    print('这里出现了异常')

输出:
11
这里出现了异常

注意:try 后面必须跟上 except

(2)捕获具体的异常

except 后面可以写上捕获具体的异常类型
还可以通过as 把捕获的异常信息 储存到后面的变量里面

例子:

try:
    print(11)
    print(a)
    print(22)
except NameError as t:               #注意这个具体的异常必须和上面出现的异常一样。可以换成Exception,这是所有异常的父类
    print('这里出现了异常')
    print('错误的原因是:%s'%t)

输出:
11
这里出现了异常
错误的原因是:name 'a' is not defined

(3)捕获多种异常

写法一:可以写多个except

try:
        pass
except TabError:
        pass
except NameError:
        pass

写法二:在except后面用括号把多种异常类型给括起来

try:
        pass
except (NameError,TabError):
        pass

如果不确定异常类型:

try:
        pass
except Exception:		#因为Exception里面包括所有普通异常
        pass

关于 Exception 及其 子类 的解释:
代码中会出现的异常都是 Exception 的子类, 因此在 except 中只需要在最后加上 Exception 即可

在捕获异常的过程中,会从上倒下依次对比异常,找到之后就不会再往后查找

(4)更加丰富的结构:

try:
        print(11)
        print(a)
        print(22)
except Exception as result:
        print('捕获到了异常,会执行我下面的代码对异常进行处理')
        print(result)
else:
        print('没有捕获到异常,执行我')
finally:
        print('不管有没有异常,我都会执行')

注意事项:
1.try 下面放可能出错的代码
2.except try下面的代码出错后,会执行except下面的代码
4.finally 不管try下面的代码有没有出错,始终都会执行

(5)扩展(自定义异常类型)

raise 主动抛出异常
格式:raise 异常类型
注意:raise是主动抛出后面写的异常类型

1.可以自己写自定义的异常:

class WuMou(Exception):
        pass
raise WuMou('出现错误')

输出为:

Traceback (most recent call last):
  File "C:/my/pycharm_work/ceshi.py", line 3, in <module>
    raise WuMou('出现错误')
__main__.WuMou: 出现错误

可以捕获这个异常:

class WuMou(Exception):
        pass

try:
        raise WuMou('出现错误')
except WuMou as h:
        print(h)

输出为:
出现错误

2.例子:

raise NameError('出现错误啦')

输出为:

Traceback (most recent call last):
  File "C:/my/pycharm_work/ceshi.py", line 2, in <module>
    raise NameError('出现错误啦')
NameError: 出现错误啦