1、异常
所有异常类都是BaseException的子类,可以用raise 抛出异常:
class EvenOnly(list):
def append(self,integer):
if not isinstance(integer,int):
raise TypeError("Only integers can be added")
if integer % 2:
raise ValueError("Only even integers can be added")
super(EvenOnly,self).append(integer)
tmp = EvenOnly()
tmp.append(2.2)
print tmp[0]
发生异常后,程序就会终止,不再运行。跟C++一样,我们可以用try...except...的语法来捕获异常并进行处理:
class EvenOnly(list):
def append(self,integer):
try:
if not isinstance(integer,int):
raise TypeError("Only integers can be added")
if integer % 2:
raise ValueError("Only even integers can be added")
super(EvenOnly,self).append(integer)
except:
print "I'm here"
或者还可以捕获指定的异常:
class EvenOnly(list):
def append(self,integer):
try:
if not isinstance(integer,int):
raise TypeError("Only integers can be added")
if integer % 2:
raise ValueError("Only even integers can be added")
super(EvenOnly,self).append(integer)
except ValueError:
print "I'm here"
except TypeError:
print "Type Error"
except:
print "ERROR"
异常类在被生成时,通常会有初始化信息,我们可以用下面的方式来访问某个异常的信息:
except ValueError as e:
print e.args
在python里也有finally,无论是否抛出异常,它都会执行;我们还可以用if...else来决定抛出异常时执行else语句:
import random
some_exceptions = [ValueError, TypeError, IndexError, None]
try:
choice = random.choice(some_exceptions)
print("raising {}".format(choice))
if choice:
raise choice("An error")
except ValueError:
print("Caught a ValueError")
except Exception as e:
print("Caught some other error: %s" % ( e.__class__.__name__))
else:
print("This code called if there is no exception")
finally:
print("This cleanup code is always called")
PS:这里的if和else缩进不同!
2、异常类的继承关系
根据需要,我们可以通过继承来定义自己的异常类~