Pyton学习总结(7)-异常

来源:互联网 发布:thething知乎 编辑:程序博客网 时间:2024/05/17 23:18

处理异常

  • 异常有不同的类型,其类型会作为消息的一部分打印出来,内置的异常 列出了内置的异常以及它们的含义。
while True:    try:        x = int(raw_input("Please enter a number: "))        break    except ValueError:        print "Oops!  That was no valid number.  Try again..."    except (RuntimeError, TypeError, NameError):        pass    except IOError as e:        print "I/O error({0}): {1}".format(e.errno, e.strerror)    else :         pass
  • try语句可能有多个异常子句,用来指定多个不同的异常。不过至多只有一个处理程序将被执行。
  • 如果异常的类型与 except 关键字后面的异常名不匹配,它将被传递给上层的try语句。
  • 一个 except 子句可以用带括号的元组列出多个异常的名字。括号是必须的。
  • else子句必须放在except后面,当try没有抛出异常时将执行该语句,当try执行returnelse子句将不会被执行。
  • 使用else子句比把额外的代码放在try子句中要好,因为它可以避免意外捕获不是由try ... except语句保护的代码所引发的异常。
  • except子句可以在异常名(或元组)之后指定一个变量。这个变量将绑定于一个异常实例,同时异常的参数将存放在实例的args中。
try:   raise Exception('spam', 'eggs')except Exception as inst:   print type(inst)     # the exception instance   print inst.args      # output : spam eggs   print inst           # __str__ allows args to be printed directly

引发异常

raise语句允许程序员强行引发一个指定的异常。

try:    raise NameError('HiThere')except NameError:    print 'An exception flew by!'    raise

自定义异常

class MyError(Exception):    def __init__(self, value):        self.value = value    def __str__(self):        return repr(self.value)try:    raise MyError(2*2)except MyError as e:    print 'My exception occurred, value:', e.value
  • 用户可以通过创建新的异常类来命名自己的异常。异常通常应该继承Exception类,直接继承或者间接继承都可以。
  • 创建一个能够引发几种不同错误的模块时,一个通常的做法是为该模块定义的异常创建一个基类,然后基于这个基类为不同的错误情况创建特定的子类。

finally

  • try语句有另一个可选的子句,目的在于定义必须在所有情况下执行的清理操作。
  • 不管有没有发生异常,在离开try语句之前总是会执行finally子句。
  • 另外,假如tryelseexceptfinally语句都包含return时,函数的返回值为最后执行的return语句,也就是finally中的return语句,因为它总是最后执行。
try:    raise KeyboardInterruptfinally:    print 'Goodbye, world!'
0 0
原创粉丝点击