异常
异常是什么?
程序运行过程中出现异常,程序还能正常运行吗?
如果出现异常该如何让程序正常运行下去呢?
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在Python无法正常处理程序时就会发生一个异常。
异常是Python对象,表示一个错误。
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
语法规则
try-except
异常是我们敲代码的过程中遇到最多的,那么我们有什么办法来捕获异常呢?
1 | a = 1 |
1 | NameError: name 'b' is not defined |
捕获异常 ,让代码正常执行
1 | try: |
1 | name 'b' is not defined |
通过捕获异常,代码不仅把错误打印了,后面的代码也正常执行了。
那么其他异常怎么办呢?是一样的吗?
1 | try: |
1 | FileNotFoundError: [Errno 2] No such file or directory: 'test.txt' |
不同类型的异常,就要用不同的状态去捕获
1 | try: |
1 | [Errno 2] No such file or directory: 'test.txt' |
异常那么多,我们需要每一个都写吗?
1 | try: |
1 | unsupported operand type(s) for +: 'int' and 'str' |
同时出现两个异常,会都捕获吗?
1 | try: |
1 | name 'c' is not defined |
出现异常后,报异常后的代码就不会执行了,就会跳到except去执行。
try-except-else
1 | try: |
1 | [Errno 2] No such file or directory: 'tests.txt' |
这是有抛出异常的情况。
1 | try: |
1 | ok |
这是没有异常的情况
else是在不抛出异常的情况下执行。
try-except-finally
1 | try: |
1 | [Errno 2] No such file or directory: 'tests.txt' |
这是抛出异常的情况
1 | try: |
1 | end |
这是不抛出异常的情况
不管会不会抛出异常,finally都会在最后执行。
返回错误
1 | def func(): |
1 | [Errno 2] No such file or directory: 'tx.txt' |
直接抛出异常
1 | def func(): |
1 | FileNotFoundError: [Errno 2] No such file or directory: 'tx.txt' |
raise是直接抛出异常–和不使用try是一样的。
自定义类
1 | class MyError(Exception): |
1 | My exception occurred, value: 4 |
自定义异常错误
1 | class MyError(ValueError): |
1 | errCode: -1 |
注意
注意事项:
try 后面必须跟上 except
except 只有在函数中才能使用 return
finally 不管是否发生异常,始终都会执行
总结
try: 将可能会发生异常的代码放在try中,就可以得到异常,并做相应处理
except: except用来接受异常,并且可以抛出或者返回异常
else和finally: else在没有异常的时候会执行;finally不管是否有异常,都会执行
异常处理
python中有哪些异常?
怎样查看所有的异常?
如何通过程序的报错来找到有问题的代码
异常层次结构
在 Python 中所有的异常都是继承 BaseException
代码中会出现的异常都是 Exception 的子类, 因此在 except 中只需要在最后加上 Exception 即可
在抛出异常的过程中,会从上倒下依次对比异常,找到之后就不会再往后查找
错误回溯
总结
在今后的学习和工作过程中,会遇到大量的报错,每个开发人员都必须掌握查找和解决报错的能力
在自己无法解决需要寻求帮助时,也要掌握如何描述问题,把问题描述清楚的能力,这会大大节省双方的时间和精力
断言
在调试代码过程中,对于不知道的值可以使用print输出查看一下,但是有些时候,我们清楚某个值应该是怎样的,比如应该是int类型的数据,这个时候需要在类型不对的情况下终止代码,再来调试代码,该怎么做呢?
1 | assert 1==1 |
断言语句是将调试断言插入程序的一种便捷方式
assert 的语法规则是:
表达式返回 True 不报错
表达式返回 False 报错 报 AssertionError
转载请注明:Seven的博客