在上一节中,我们讲了如何对程序中的异常进行处理,但这是针对程序在运行过程中系统自动抛出的异常,而让程序被动的抛出异常在实践中也具有重要作用。
1、raise语句抛出异常
raise 语句可以使用一个类(必须是 Exception 或者 Exception 类的子类)或异常对象抛出异常。如果使用类,系统会自动创建类的实例。具体语法如下:
raise [Exception [, args [, traceback]]]
在语句中Exception是异常的类型(例如:NameError)参数标准异常中任一种,args是自己提供的异常参数。最后一个参数是可选的,如果存在,是跟踪异常对象。
例如:
# 输出等级的方法,如果等级<1 则抛出异常
def typeTest(level):
if type(level) != int:
raise Exception('输入类型不符', level)
print(f'您输入的是:{level}')
try:
typeTest(1.2)
except Exception as e:
print(e) # ('输入类型不符', 1.2)
当输入不是整数时,程序则会运行raise语句,抛出异常,异常信息为('输入类型不符', 1.2),这个信息就是由自己来定义。
当输入是整数时,程序则输出“您输入的是:1”。
2、assert语句
assert是python中的一个关键字,称为“断言”,使用assert语句同样可以引发异常。但与raise语句不同,当这个关键字后边的条件为假的时候,程序才会抛出AssertionError的异常。assert语句的语法格式如下:
assert condition
如果condition为false,那么程序抛出AssertionError异常
用法1
assert 1 == 2
正如assert翻译的意思“断言”,当程序运行到某个节点的时候,就断定某个变量的值必然是什么,或者对象必然拥有某个属性等,简单说就是断定什么东西必然是什么,如果不是,就会抛出错误。
用法2
class Account:
def __ init__(self):
self.balance = 0
def cal(self, amount):
assert amount > 0
self.balance += amount
if __ name__ == '__ main__':
a = Account()
a.cal(-10)
从上面代码可以看出,cal()方法的参数 amount 值必须大于零的,如果不满足条件就会报错。一般来说assert相当于在程序中置入了一个检查点,当需要确保程序中的某个条件一定为真才能让程序正常工作。
3、自定义异常
在 Python 中,可以通过继承 Exception 类来创建自己的异常称为自定义异常。异常类和其他的类并没有区别。最简单的自定义异常类就是一个空的 Exception 类的子类。语法格式如下:
class MyException(Exception):
pass
下面通过继承 Exception 类来生成一个 SexException 类。如果给 Student 类的属性 sex赋值时候,如果不是“男”或者“女”就抛出自定义的 SexException。示例如下:
# 自定义异常
class SexException(Exception):
def __ init__(self, msg):
self.msg = msg
class Student:
def __ init__(self, name):
self.name = name
# self.__sex = sex
@ property
def sex(self):
return self.__sex
@sex.setter
def sex(self, sex):
if sex == '男' or sex == '女':
self.__sex = sex
else:
raise SexException('性别的参数值不正确,只能是男或者女')
def __ str__(self):
return '姓名:{0},性别:{1}'.format(self.name,self.__sex)
s1=Student('张三')
s1.sex = 'abc' #给 s1 的属性 sex 赋值,
print(s1)
从上面的代码中可以看出,对 sex 属性赋值时候有可能有异常,需要进行捕获异常。
#自定义异常
class SexException(Exception):
def __ init__(self, msg):
self.msg = msg
class Student:
def __ init__(self,name):
self.name=name
# self.__sex=sex
@property
def sex(self):
return self.__sex
@sex.setter
def sex(self,sex):
if sex=='男' or sex=='女':
self.__sex=sex
else:
raise SexException('性别的参数值不正确,只能是男或者女')
def __ str__(self):
return '姓名:{0},性别:{1}'.format(self.name,self.__sex)
s1=Student('张三')
try:
s1.sex='abc' # 给 s1 的属性 sex 赋值,
print(s1)
except Exception as e:
print(e)