Chinaunix首页 | 论坛 | 博客

分类: Python/Ruby

2014-02-23 13:37:51

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):
  File "", line 1, in
AssertionError: not equal
        c、利用__debug__。它是程序的内置变量,可用于调试。
if __debug__:
        print 'hello'
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。据此,可作为对对象的清除做操的依据。


阅读(565) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~