python学习总结(3)

发布时间:2019-08-15编辑:脚本学堂
python学习总结(3),异常处理部分,供大家学习参考。

python学习总结(3),异常处理部分,供大家学习参考。

1.处理异常

import sys

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())

except IOError, (errno, strerror):
    print "I/O error(%s): %s" % (errno, strerror)

except ValueError:
    print "Could not convert data to an integer."

except:
    print "Unexpected error:", sys.exc_info()[0]
    raise

    和 java 对比,差不多的用法。只是他不存在花括号。以冒号和缩进进行的作用域封装。还有就是 except 类似 java 或 c++ 中的 catch 。
    try ... except 语句可以带有一个 else 子句,该子句只能出现在所有 except 子句之后。当 try 语句没有抛出异常时,需要执行一些代码,可以使用这个子句。例如:

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

2.抛出异常

try:
    raise NameError, 'HiThere'

except NameError,a:
    print 'An exception flew by!'
    #raise
    print type(a)
print a.args

    主要函数 raise , 该函数第一个参数是异常名,第二个是这个异常的实例,它存储在 instance.args 的参数中。
    except NameError,a: 中第二个参数意思差不多。

3.用户自定义异常

class MyError(Exception):
    def __init__(self, value):
        self.value = value
    def __str__(self):
      return repr(self.value)
try:
  raise MyError(2*2)
except MyError, e:
  print 'My exception occurred, value:', e.value

    异常类中可以定义任何其它类中可以定义的东西,但是通常为了保持简单,只在其中加入几个属性信息,以供异常处理句柄提取。如果一个新创建的模块中需要抛出几种不同的错误时,一个通常的作法是为该模块定义一个异常基类,然后针对不同的错误类型派生出对应的异常子类。

class Error(Exception):
    """Base class for exceptions in this module."""
    pass

class InputError(Error):
    """Exception raised for errors in the input.

    Attributes:
        expression -- input expression in which the error occurred
        message -- explanation of the error
    """
    def __init__(self, expression, message):
        self.expression = expression
        self.message = message

class TransitionError(Error):
    """Raised when an operation attempts a state transition that's not
    allowed.
    Attributes:
        previous -- state at beginning of transition
        next -- attempted new state
        message -- explanation of why the specific transition is not allowed
    """
    def __init__(self, previous, next, message):
        self.previous = previous
        self.next = next
        self.message = message

4.定义清理行为

    try 语句还有另一个可选的子句,目的在于定义在任何情况下都一定要执行的功能。例如:

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print 'Goodbye, world!'
...
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in ?
KeyboardInterrupt

    不管 try 子句中有没有发生异常, finally 子句都一定会被执行。如果发生异常,在 finally 子句执行完后它会被重新抛出。 try 子句经由 break 或 return 退出也一样会执行 finally 子句。

    在 try 语句中可以使用若干个 except 子句或一个 finally 子句,但两者不能共存。