1:因为异常是class,捕获一个异常就是捕获到该class的一个实例。因此,错误并不是凭空产生的,而是有意创建并抛出的。Python的内置函数会抛出很多类型的错误,我们自己编写的函数也可以抛出错误。如果要抛出错误,首先根据需要,可以定义一个错误的class,选择好继承关系,然后,语句raise抛出一个错误的实例:
'''
自定义异常类(继承标准异常ValueError),或者直接继承BaseException和Exception,
'''
classUserDefineError(ValueError):
def__init__(self, *args, **kwargs):
print("User define error",len(args),args[])
deffunc(s):
n =int(s)
ifn==:
raiseUserDefineError('invalid value: %s'% s)
#手工触发raise异常
return10/ n
if__name__ =='__main__':
a = func('0')
print(a)
'''
**********输出结果***********:
Traceback(most recent call last):
File "D:\007-Testing Code\Java&Python\Python_Test\test\test_1.py",line 17, in
a=func('0')
File "D:\007-Testing Code\Java&Python\Python_Test\test\test_1.py",line 14, infunc
User define error 1 invalid value: 0
raise UserDefineError('invalid value: %s' % s)
__main__.UserDefineError: invalid value: 0
可以定位到自定义的异常类
'''
阅读开源代码时,经常能看到,单独一个raise的使用,这个是把最近一次产生的异常重新抛出来,交给上层处理。(我已经知道这个异常发生并且捕获到了,但是我不做处理,而由我的上层调用处理。)
'''
例子
'''
if__name__ =="__main__":
try:
try:
raiseIOError
exceptIOError:
print("inner exception")
raise#
exceptIOError:
print("outterexception")
'''
*********输出结果***********:
inner exception
outterexception
首先被内层IOError异常捕获,打印“inner exception”,然后把相同的异常再抛出,被外层的except捕获,打印"outterexception"
'''
2:断言:
断言语句等价于这样的Python表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常:
'''
例子
'''
if__name__ =="__main__":
a =2
try:
#当a==1的时候,则不触发异常,当表达式返回false的时候触发异常(AssertionError)。
asserta ==1
print("no error")
exceptAssertionError:
print("Assert error!!")
领取专属 10元无门槛券
私享最新 技术干货