异常处理

1. 错误,异常, 异常抛出,抛出机制 
a)错误:
提到异常,首先肯定是要知道异常是怎么来,那要从错误开始。
错误---是当python检测到错误(语法错误或者逻辑错误等)时,导致解释器无法继续执行下去,这时候就出现了异常.

b)异常:
它是因为程序出现了错误而在正常控制流以外采取的行为.只要检测到错误,并且意识到异常条件, 解释器会抛出一个异常

c)异常抛出:
异常抛出机制,为程序开发人员提供了一种在运行时发现错误,进行恢复处理,然后继续执行的能力

d)抛出机制:
1. 如果在运行时发生异常的话,解释器会查找相应的处理语句(称为 handler )。
2. 要是在当前函数里没有找到的话,它会将异常传递给上层的调用函数,看看那里能不能处理。
3. 如果在最外层(全局” main” )还是没有找到的话,解释器就会退出,同时打印出traceback 以便让用户找出错误产生的原因
注意:虽然大多数错误会导致异常,但一个异常不一定代表错误。有时候它们只是一个警告,有时候它们可能是一个终止信号,比如退出循环。

2. 常见异常

AssertionError----断言语句失败
AttributeError----对象没有这个属性,试图访问一个对象没有的属性
IOError-----------输入/输出操作失败,基本是无法打开文件
ImportError-------无法引入模块或者包,基本是路径问题
IndentationError--语法错误,代码没有正确的对齐(缩进错误)
IndexError--------下标索引超出序列边界
KeyError----------试图访问你字典里不存载的键
KeyboardInterrupt-用户中断执行(ctrl+c)
NameError---------使用一个还未赋予对象的变量
SyntaxError-------Python 代码逻辑语法出错,不能执行
TypeError---------传入的对象类型与要求不符
UnboundLocalError-试图访问一个还未设置的全局变量
ValueError--------传入一个不被期望的值,即使类型正确

3. 检测和处理异常

异常可以通过 try 语句来检测. 任何在 try 语句块里的代码都会被监测, 检查有无异常发生.
try 语句有两种主要形式: try-except 和 try-finally 
一个try语句可以对应一个或多个except子句, 但只能对应一个finally子句, 或是一个try-except-finally 复合语句.

a)try-except语句

格式为:
try
    try_suite        # 监控这里的异常
except Exception[, reason]:
      except_suite    # 异常处理代码
eg1: 
>>> try:
...     p=open('ab','r')
... except IOError,e:
...     print "no such file or directory"
... 
no such file or directory
>>> 

b)带有多个except的try语句
你可以把多个 except 语句连接在一起, 处理一个 try 块中可能发生的多种异常, 如下所示:
except Exception1[, reason1]:
    suite_for_exception_Exception1
except Exception2[, reason2]:
    suite_for_exception_Exception2

同样, 首先尝试执行 try 子句, 如果没有错误, 忽略所有的 except 从句继续执行. 如果发生异常, 解释器将在这一串处理器(except 子句)中查找匹配的异常. 如果找到对应的处理器,执行流将跳转到这里.
>>> try:
...     p=open('ab','r')
... except IOError,e:
...     print "no such file or directory"
... except TypeError,e:
...     print "ab is string"
... 
no such file or directory
>>> 

c)finally语句
finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码.你可以将 finally 仅仅配合try 一起使用,也可以和 try-except(else 也是可选的)一起使用.
格式为:
try:
     A
except MyException:
     B
finally: 
     C

eg:
>>> try:
...     p=open('aa','r')
... except IOError,e:
...     print "no such file or directory"
... finally:
...     p.read()
... 
'abcd'
注意:当没有异常发生的时候, finally 中的代码会在 try 完成之后立即运行。如果发生任何错误,那么 finally 的代码还是会被执行,但是它不会消除异常,异常依然还是会在调用机制中寻找上一级的异常抛出中寻找处理语句

4. raise 抛出异常
格式:
raise [SomeException [, args [, traceback]]]
SomeExcpetion,是触发异常的名字,.如果有,它必须是一个字符串,类或实例
args(比如参数,值),来传给异常.这可以是一个单独的对象也可以是一个对象的元组.当异常发生时,异常的参数总是作为一个元组传入.如果 args 原本就是元组,那么就将其传给异常去处理;如果 args 是一个单独的对象,就生成只有一个元素的元组(就是单元素元组).大多数情况下,单一的字符串用来指示错误的原因.如果传的是元组,通常的组成是一个错误字符串,一个
错误编号,可能还有一个错误的地址,比如文件,等等.
eg: 
>>> if "a">5:
...     raise TypeError("'a' must be integer")
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: 'a' must be integer
>>>

多个异常

  

完整异常处理语句:

  

posted @ 2016-06-29 16:05  6随6心6  阅读(102)  评论(0编辑  收藏  举报