自学python系列8:错误和异常

1.1什么是异常

1.1.1错误
     从软件方面,错误是语法或逻辑上的。语法错误指结构有错误。
     逻辑错误指不完整或不合法的输入所致:逻辑无法生成,计算,输出结果需要的过程无法执行。
1.1.2异常
     对异常的描述:它是因为程序出现了错误而在正常控制流以外采取的行为。
     该行为分为两个阶段:首先引起异常发生的错误,然后检测阶段。
 
1.2python的异常
     遇到程序"崩溃" 或因未解决的错误而终止的情况。你会看到"跟踪记录(traceback)"消息以及随后解释器向你提供的信息,包括错误的名称,原因和发生错误的行号。
     1.NameError:尝试访问一个未申明的变量
>>> a

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    a
NameError: name 'a' is not defined
     2.ZeroDivisionError:除数为零
>>> 1/0

Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    1/0
ZeroDivisionError: integer division or modulo by zero
 
     3.SyntaxError:解释器语法错误,无效的语法
>>> for
SyntaxError: invalid syntax
 
     4.IndexError:请求的索引超出序列范围
>>> a=[]
>>> a[0]

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a[0]
IndexError: list index out of range

     5.KeyError:请求一个不存在的字典关键字
>>> x={'a':1,'b':2}
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    print x['c']
KeyError: 'c'
 
     6.IO输入/输出错误
>>> f=open("a")

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    f=open("a")
IOError: [Errno 2] No such file or directory: 'a'
 
     7.AttributeError:尝试访问未知的对象属性
>>> class a(object):
     pass
>>> a.foo

Traceback (most recent call last):
  File "<pyshell#19>", line 1, in <module>
    a.foo
AttributeError: 'list' object has no attribute 'foo'
 
1.3检测和处理异常
     异常可以通过try语句检测。
     try语句两种主要形式:try-except和try-finally
。这两个语句互斥,只能使用其中的一种。
     一个try可对应一个或多个except,只能对应一个finally或一个try-except-finally复合语句
     可使用try-except语句检测处理异常。try-finally只能检测异常和做一些清除工作(无论发生错误是否)
 
1.3.1 try-except
     try:
          try_suite #监控这里的异常
     except Excepetion[,reason]:
          except_suite #异常处理代码
     例子:
>>> try:
     f=open('a','r+')
except IOError,e:
     print 'a',e

    
a [Errno 2] No such file or directory: 'a'
     
     1.3.2包装内建函数
     例子:float()内建函数
>>> float(1)

1.0
>>> float('a')  #想把字符串转换成浮点型

Traceback (most recent call last):
  File "<pyshell#38>", line 1, in <module>
    float('a')
ValueError: could not convert string to float: a

>>> float(['this',1,'list'])    #想把列表转换成浮点型

Traceback (most recent call last):
  File "<pyshell#39>", line 1, in <module>
    float(['this',1,'list'])
TypeError: float() argument must be a string or a number
     float()对不合法的参数不客气。前一个是参数类型正确,值不可转换,引发ValueError;后一个是值错误,引发TypeError异常。
     怎么样来安全地调用float()函数。可以创建一个"封装"函数,在try-except协助下创建我们的环境,safe_float()。
>>> def safe_float(obj):
     try:
          return float(obj)
     except ValueError,TypeError:
          pass
 
改进:
>>> def safe_float(obj):
     try:
          a=float(obj)
     except ValueError:
          a=None
     return a
>>> def safe_float(obj):
     try:
          a=float(obj)
     except ValueError:
          a=None
     return a

>>> safe_float('12')
12.0
>>> safe_float('a')
>>> def safe_float(obj):
     try:
          a=float(obj)
     except ValueError:
          a='error'
     return a
给予具体的错误提示
>>> safe_float('a')
'error'
 
1.3.3带有多个except的try语句
     可以把多个except语句连载一起处理一个try可能发生的多个异常:   
except Excepetion1[,reason1]:
     suite_for_exception_Exception1
except Excepetion2[,reason2]:
     suite_for_exception_Exception2
 
例子:
>>> def safe_float(obj):
     try:
          a=float(obj)
     except ValueError:
          a='valueerror'
     except TypeError:
          a='typeerror'
     return a

>>> safe_float(['this',1,'list'])
 
1.3.4处理多个异常的except语句
>>> def safe_float(obj):
     try:
          a=float(obj)
     except (ValueError,TypeError):
          a='error'
     return a
注意点用圆括号来包含所有的错误类型
 
1.3.5捕获所有异常
     若查询异常继承的树结构,Exception在最顶层。所以代码会是这样:
     try:
          :
     except Exception,e:
          #error
     关于捕获所有异常,应知道有些异常不是由于错误条件引起的。它们是systemExit和keyboardInterupt。
 
 
若需要捕获所有异常,就得用新的BaseExcepetion:
try:
     :
except BaseException,e:
 
当然,也可以使用不被推荐的空except子句
1.3.6异常参数
 
1.3.8 else子句
      else语句配合其他的python语句,如条件和循环。至于try-except语句段,它的功能和你见过的其他else没有不同:在try范围没被检测到时,执行else子句。
 
1.3.9finally子句
     finally子句是无论异常是否发生,是否捕捉都会执行的代码。可将finally配合try一起使用。
>>> try:

     A
except MyException:
     B
else:
     C
finally:

     D 
 
可以有不止一个except子句,但最少有一个except语句,而else和finally都是可选的。
 
1.3.10try-finally语句
     finally单独和try连用。finally代码段都会被执行。
     try:
          try_suite
     finally:
          finally_suite #无法如何都执行
 
 
posted @ 2014-11-15 17:46  Mr.Dantes  阅读(876)  评论(0编辑  收藏  举报