4 Except the unexcepted

本文介绍了Python中异常处理的基本概念及使用方法,包括如何定义自定义异常类、如何使用try...except...finally语句块捕获和处理异常,以及如何获取异常的具体信息。

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、异常类的继承关系


根据需要,我们可以通过继承来定义自己的异常类~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值