View on GitHub

personal-study-nodes

个人学习过程中整理的一些笔记

十、异常

1. 处理异常

捕获异常语法:

try:

​ 代码块(可能出现异常的语句)

execpt [error class] as [error name]:

​ 代码块(出现异常执行的语句)

else:

​ 代码块(程序正常运行时执行的语句)

finally:

​ 代码块(无论是否出现异常都会执行)

print('代码执行之前')
try:
    a = 10 / 0
except:
    print('出现异常')
else:
    print('没出现异常')
finally:
    print('最终')
print('代码执行之后')

执行效果:

代码执行之前
出现异常
代码执行之后

2. 异常的传播

在函数中出现异常时,如果函数中对异常做了处理,则异常不会传播,若没处理,异常则会向函数调用出传播,直到传递到全局作用域。

使用raise关键字可以主动向外部抛出异常

def add(a, b):
    if a < 0 or b < 0:
        # raise用于向外部抛出异常,后边可以跟一个异常类,或者一个异常对象
        raise Exception('传入参数不能小于0')
    return a + b


add(100, -1)

执行效果:

3. 异常对象

当程序的运行过程中出现异常时,异常信息会保存在对应专门的异常对象中,如:

ZeroDivisionError类的对象专门用来保存除0的异常;

NameError类是处理变量错误的异常;

` IndexError`索引异常等…

官方文档

print('代码执行之前')
try:
    # a = 10 / 0
    # print(c)
    1 + 'h'
except NameError:
    print('出现 NameError 异常')
except ZeroDivisionError:
    print('出现 ZeroDivisionError 异常')
except Exception as e:
    print('未知的异常', e, type(e))
print('代码执行之后')
  • except后面能指定捕获的异常
  • Exception是所有异常的父类,此处相当等于except:,能捕获所有异常
  • 异常类后面可以使用 as xx获取异常对象

4. 自定义异常对象

自定义异常需要继承Exception

class AddException(Exception):
    pass


def add(a, b):
    if a < 0 or b < 0:
        raise AddException('自定义异常:传入参数不能小于0')
    return a + b


add(100, -1)

执行效果: