1、捕获异常的方法? 使用try/except语句即可。 戏分为以下几种类型:
a、知道 try : 后面的语句有可能会产生怎样的异常,则:
>>> try:
... print a
... except NameError as e:
... print e.args
...
("name 'a' is not defined",)
其中except NameError as e语句使得异常产生时,会构造一个NameError类的对象,记录了异常产生的原因。当然,一个try后面可以跟着多个except分支。
b、由于try后面的语句中会产生多个异常,甚至异常的种类不清楚,则:
>>> try:
... print a
... except Exception as e:
... print e.args
...
("name 'a' is not defined",)
使用Exception可以捕捉与程序退出相关异常之外的所有异常,每一种异常的类型都是一个类,在5.4.1节中列出了所有类之间的继承关系。程序退出相关异常有:KeyboardInterrupt、
Systemexit等,大多数异常的父类都是Exception。
c、如果连异常相关的类都不放过,那就使用如下语句:
>>> try:
... print a
... except:
... print 'hello'
这种方法会导致,使用CTL+C也停止不了程序了。一般别使用。
2、捕获异常的完整结构。
try:
print a
except Exception as e:
print e.args
else:
print 'else'
finally:
print 'finally'
如果a没有定义,那么就会执行except Exception as e: 和 finally下面的语句,结果如下:
("name 'a' is not defined",)
finally
如果a定义,那么将执行print a, else, 和finally下面的语句:
10
else
finally
注意:上面的顺序固定,且只能有一个else.
3、如果except、else、finally中的语句出现异常怎么办?
开始时(发生异常前)执行顺序仍与前面一致,当except或else中发生了异常,那么转而去执行finally中的语句,完毕后,再引发异常(如果异常有异常处理,那么执行仍按照
上面的步骤执行)。
a=10
try:
print a
except Exception as e:
print e.args
else:
print b
finally:
print c
print 'finally'
执行结果是:
10
Traceback (most recent call last):
File "./calculate.py", line 12, in
print c
NameError: name 'c' is not defined
先执行a=10, 然后执行else分支,由于print b产生异常,跳过else接下来的语句(虽然没写),转而执行finally语句;print c此时也会产生异常,那么直接引发异常。
4、如何主动引发异常?
a、利用raise语句。
>>> raise NameError('not a numer')
Traceback (most recent call last):
File "", line 1, in
NameError: not a numer
b、利用 assert test [,msg]语句。
>>> assert 10==11, 'not equal'
Traceback (most recent call last):
AssertionError: not equal
c、利用__debug__。它是程序的内置变量,可用于调试。
5、每一种异常都是一个类,那么如何自定义自己的一个异常类? 自己定义的异常类除了利用raise语句出发,还有什么办法?
暂时没有发现定义一个异常类会带来什么样的好处,以后在看。
6、上下文管理器与with语句。
当我们使用try/except时,except中的语句除了要分析产生异常的原因,还有一部分工作就是释放资源。但是一个对象它拥有多少资源只有它自己最清楚,将这部分的工作交给
对象自己做应该更合适。try/except可以和with语句一起使用。
要实现上面的想法,要求对象支持__enter__和__exit__操作,也叫做支持上下文管理的对象。具体如下:
with open('myfile', 'w') as f :
f.write("hello")
...
f.write("done")
open('myfile', 'w')看成是一个对象obj, 那么f表示obj.__enter__调用结果的返回值,当with语句执行完之前,有调用obj__exit__函数,该函数的原型是
__exit__(selft, type, value, traceback),正常情况type、value、tracevback都是None,异常情况下,不为None。据此,可作为对对象的清除做操的依据。
阅读(605) | 评论(0) | 转发(0) |