Python错误和异常

异常是因为程序出现了错误而在正常控制流以外采取的行为。这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测阶段。

异常通过try语句实现。一个try语句可以对应一个或except语句,但只能对应一个finally语句。

try:
    try_suite
except Exception[,reason]:
    except_suite
   
try:
    ....
except ... as ...:
    ...    #as子句获取实例的__class__属性来获取异常类。

在程序运行时,解释器尝试执行try块中的代码,若无异常发生,则跳过except继续执行。若发生except语句中指定的异常,则忽略try中剩余的语句,执行except块。如果没有找到合适的处理器,那么异常就向上移交给调用者去处理。如果到达最顶层仍然没有对应的处理器,那么就认为这个异常是未处理的,Python解释器会显示除跟踪记录,然后退出。

异常的继承结构:-BaseException

                                |-KeyboardInterrupt

                                |-SystemExit

                                |-Exception

                                    |-(all other current build-in exceptions)

避免把大片的代码装入try-except中然后使用pass忽略掉错误。可以捕获特定的异常并忽略它们,或是捕获所有异常并采取特定的行动。不要捕获所有异常,然后忽略它们。

异常可以有参数,异常引发后它作为附加帮助信息被传递给异常处理器。标准内建异常提供至少一个参数,指示异常原因的一个字符串。调用str(reason)总会返回一个良好可读的错误原因,实际上这样做是调用类的特殊方法__str()__。

finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。

一个注意点:如果finally中的代码引发了另一个异常或由于return,break,continue语法而终止,原来的异常将丢失而且无法重新引发。


上下文管理:

with语句用于简化代码,其目的在于从流程图中把try,except,finally关键字和资源分配释放相关代码统统去掉。

with expression [as variable]:
    with-block

varible并非赋值为expression的结果。expression的结果是支持环境协议的对象,而variable则是赋值为其他的东西。

拿文件的例子来说,就是可以不用显示地关闭文件:

with open('...','r') as f:
    for each in f:
        #do something...

无论在这段代码的开始,中间还是结束时发生异常,都会执行清理的代码,文件会被自动关闭。

只有内建了“上下文管理”的对象可以和with一起工作。

with语句实际的工作方式:1、计算表达式,得到的对象称为环境管理器,有__enter__和__exit__方法。2、__enter__方法被调用,若as子句存在,其返回值赋值给变量,否则丢弃。3、代码块中代码执行。4、若引起异常,__exit__会被调用,返回(type,value,traceback),这些和sys.exc_info返回相同值。若没有引发异常,__exit__依然被调用,type,value,traceback为None


触发异常:

raise [SomeException [,args [,traceback]]]

SomeException为类或实例。异常的参数总是作为一个元组传入(包含错误码,错误原因等)。标准异常总是类的实例,对此下列两种形式是对等的,都会引发指定异常的一个实例,但是,第一种形式隐式地创建实例:

raise IndexError
raise IndexError()

断言是一句必须等价于布尔真的判定;此外,发生异常也意味着表达式为假。assert几乎都是用来收集用户自己定义的约束条件。

所有Python标准异常:《Python核心编程》P255-257


另一个获取异常信息的途径是通过sys模块中的exc_info()函数,通常允许一个异常处理器获取对最近引发的异常的访问。此功能提供一个3元组信息:异常类,异常类的实例,跟踪记录对象(提供发生异常的上下文,包含诸如代码的执行帧,异常发生时的行号等信息)。


基于类的异常由超类关系进行匹配:只要except子句列举了异常的类或其任何超类名,引发的异常就会匹配该子句。在类异常模式中,我们总是引发和捕获一个类实例对象。

一旦异常被捕捉,其生命就结束:控制权不会跳回所有匹配这个异常的try语句,只有第一个try有机会对它进行处理。


你可能感兴趣的:(python,异常,错误)