13. 异常
当你编写程序时,难免会有一些没有发现的错误,因此在编译或运行时会出现一些错误
和异常情况,例如输出一句话的时候把print打错了:
在解释其中输入:Print 'Hello World!'
这时就会引发一个SyntaxError。当我们读取一个文件的时候,那个文件由于某些原因(例如被意外删除了)无法读取,这是就会引发另一个错误。我们怎么处理这些异常状况呢?python为我们提供了异常处理语句。还是先来看例子吧:
#!/usr/bin/python filename = 'test.txt' try: f =open(filename) exception IOError: print 'can not open %s' % filename else: print 'No exception was raised' finally: f.close() print 'Done!'
当这个文件无法读取的时候不会再像以前一样中断程序了,而是输出'can not open test.txt'。
看出来了吧,我们将可能引发一场的语句放在try语句中,然后通过exception语句捕捉异常,如果捕捉到符合我们给出类型的异常时就会执行exception语句块。如果没有捕捉到则会跳过这些语句执行,后面的语句。else语句是可选的,当没有异常时会执行那个else语句下的语句。和else语句一样可选的还有finally语句,finally语句是不论异常是否发生都会执行的语句,从上面的例子中我们知道是要读取文件,而读取文件后关闭文件时必须的,因此不论是否文件异常我们都要关闭文件。所以我们使用了finally语句。python中,错误类型有很多种,IOError只是其中一种,你可以查询一下。
我们知道了如何捕获和处理异常,这是很简单但却很重要的事情。但是,有时候你会不会觉得python为我们提供的异常类型无法满足我们或因为其他原因你想要自己定义一种异常类型呢?
没问题,python为我们提供了这种功能。注意了,现在我就告诉你一个秘密,python中的异常类型实际上是一个类。你没有听错,就是一个类。那么,让我们开始为自己定义一个异常吧:
#!/usr/bin/python class ShortInputException(Exception): '''Auser-defined exception class.''' def __init__(self,length,atleast): Exception.__init__(self) self.length=length self.atleast=atleast try: s=raw_input('Enter something --> ') iflen(s)<3: raise ShortInputException(len(s),3) # Other work can continue as usualhere except EOFError: print '\nWhy did you do an EOF on me?' except ShortInputException,e: print 'ShortInputException: The input was of length %d, \ was expecting at least %d' %(e.length,e.atleast) else: print 'No exception was raised.'
呵呵,很轻易的我们就为自己定义了一个新的可以满足我们要求的异常类型啊。我们使用raised语句来抛出(触发)这个异常。
是不是又发现奇怪的地方了,没错,怎么在exception语句中还有一个e啊?这个e是类的实例,这样我们就可以在下面的处理语句中使用这个异常的信息了。其他的异常同样可以这样使用。