python异常处理

来源:互联网 发布:阿里云缩写 编辑:程序博客网 时间:2024/05/18 02:50

1、异常简介

从软件方面来说,错误是语法或是逻辑上的,当python检测到一个错误时,解释器就会指出当前流已经无法继续执行下去,这时候就出现了异常。异常分为两个阶段:首先是引起异常发生的错误,然后是检测和采取可能的措施。常见异常有

NameErrorZeroDivisionErrorSyntaxErrorIndexErrorKeyErrorIOErrorAttributeErrorValueError

TypeError等。所有的标准/内建异常都是从根异常派生的,目前,有3个直接从BaseException派生的异常子类:SystemExitKeyboardInterruptException。其它的所有的内建异常都是Exception的子类。

2、异常检测及处理

异常可以通过try语句来检测,有两种主要形式:try-excepttry-finally。前者可以添加一个可选的else子句来处理没有检测到异常的情况。一个try语句可以对应一个或多个except语句,但只能对应一个finally子句,except用来捕获并处理异常,可以处理多个异常,也可以指定可选的异常参数(将会是一个包含来自异常的代码的诊断信息的类实例,异常参数自身会组成一个元组,并存储为类实例的属性),要避免裸except(会捕获所有异常,没有机会保存异常发生的原因,虽然可以通过sys.exc_info()获得,但不推荐,如果想捕获所有异常,可以在except中使用BaseException类,而Exception类不包括KeyboardInterruptSystemExit),finally无论发生错误与否都会执行。try-except-finally是个复合语句。try检测到异常时,try语句块中的剩余代码是不会执行的,异常会延着堆栈向上提交,直到找到合适的异常处理器,如果到达最顶层仍然没有找到对应的处理器,python解释器会显示出跟踪返回消息,然后退出。

try-except语法如下:

try:try_suiteexcept Exception1[, reason1]:suite_for_exception_ Exception1except Exception2[, reason2]:suite_for_exception_ Exception2except (Exception3, Exception4)[, reason3_4]:suite_for_exceptions_ Exception3_and_Exception4except (Exc5[, Exc6[, ...  ExcN]])[, reason]:suite_for_exceptions_ Exc5_to_ExcNelse:suite_for_no_exceptionfinally:suite_always_run

3、上下文管理中的with语句

如上提到的try-excepttry-finallypython对隐藏细节做了大量的工作,因此需要你操心的仅是如何解决你所遇到的问题。另一个隐藏低层次的抽象的例子是with语句,它在python2.6中正式启用。python2.5尝试性的引入了with,并对使用with作为标识符的应用程序发出这样的警告——在python2.6中,with将会成为关键字。如果你想在python2.5使用wiht语句,你必须用from __fututure__ import with_statement来导入它。

类似try-except-finallywith语句也是用来简化代码的,这与用try-excepttry-finally所想达到的目的千呼后应。try-excepttry-finally的一种特定的配合用法是保证共享的资源的唯一分配,并在任务结束的时候释放它。比如文件(数据、日志、数据库等等),线程资源,简单同步,数据库连接等等,with语句的目的就是应用在这种场景。然而,with语句的目的在于从流程图中把tryexceptfinally关键字和资源分配释放相关代码统统去掉,而不是像try-except-finally那样仅仅简化代码使之易用。with语法的基本用法如下:

with context_expr [as var]:with_suite

看起来如此简单,但with仅能工作于支持上下文管理协议的对象。当with语句执行时,便执行context_expr来获得一个上下文管理器,其职责是提供一个上下文对象,这是通过调用__context__()方法来实现的。一旦我们获得了上下文对象,就会调用它的__enter__()方法。当with语句块执行结束,会调用上下文对象的__exit__()方法,有三个参数,如果with语句块正常结束,三个参数都是None,如果发生异常,三个参数的值分别等于调用sys.exc_info()函数返回的三个值:类型(异常类),值(异常实例)和回溯(traceback)相应的回溯对象。contextlib模块可以帮助编写对象的上下文管理器。

4、手动触发异常raise

python提供了一种机制让我们明确的触发异常,这就是raise语句:

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

SemeException是触发异常的名字,如果有,它必须是一个字符串,类或实例,如果有argstraceback,就必须提供SomeException。最常见的用法是SomeException为一个类,不需要其它的参数。

args,可选,传给异常,这可以是一个单独的对象,也可以是一个对象的元组。大多数情况下,单一的字符串用来指示错误的原因,如果传的是元组,通常的组成是一个错误字符串,一个错误编号,可能还有一个错误的地址,比如文件,等等。

traceback,可选,追踪对象,实际上很少用它。

5、断言assert与自定义异常

python中的断言assertC语言预处理器中assert宏,语法如下:

assert  expression[, arguments]
arguments是个可选参数,断言成功时,不做任何事情,断言失败时,触发AssertionError异常。

除了标准异常之外,我们也可以创建自己的异常,一个异常类,从标准异常继承即可。


异常相关模块——

exceptions:内建异常,永远不用导入这个模块。

contextlib:为使用with语句的上下文对象工具。

sys:包含各种异常相关的对象和函数。



1 0
原创粉丝点击