Appearance
python的异常有两种,一种是python自带的异常,当我们写的代码在语法或其他功能的调用上有误时,如果没有异常捕捉的话代码运行会直接报错的,都算这一类。另一种就是当我们觉得,仅仅只是针对语法方面的报错已经不能满足我们的要求了,我们希望在某些逻辑的环节上,虽然语法没有错,但也要主动报错,以避免按照错误的逻辑继续执行,后面这一种就属于自定义异常,为的就是在我们需要的时候抛出一个异常。
抛出异常raise
形式 | 功能 |
---|---|
raise | 不带任何参数 |
raise Exception | 把异常的名称作为参数 |
raise Exception(info) | 把异常的名称、异常的描述信息作为参数 |
自定义异常
实际开发中用的比较多的是第三种,首先我们需要自定义一个异常类,自定义异常继承基类Exception:
python
class NewException(Exception):
def __init__(self, errorinfo):
super().__init__(self)
self.errorinfo = errorinfo
def __str__(self):
return self.errorinfo
然后在需要使用的地方主动抛出异常:
python
def factorial(num):
try:
if num < 0 or type(num) != int:
raise NewException("该数不能阶乘") # 主动抛出异常
else:
return num * factorial(num - 1) # 主动抛出异常
except Exception as e:
print(e)
断言assert
用于判断一个表达式,在表达式条件为false的时候触发异常。和raise的功能很相似,但是它比raise更加简洁,语法格式如下:
python
assert expression
等价于:
python
if not expression:
raise AssertionError
案例:已知某系统有三个角色:0-管理员、1-教师、2-学生,输入的其他数据均为非法数据,使用assert断言代码如下:
python
def test(n):
assert n in (0, 1, 2), "您输入了非法参数"
if n == 2:
return '学生'
elif n == 1:
return '教师'
else:
return '管理员'
输入测试语句试一下,看看是什么效果:
python
print(test(1))
print(test(1))