自学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
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
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
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
>>> 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'
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'
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
pass
>>> a.foo
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
a.foo
AttributeError: 'list' object has no attribute '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'
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
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
try:
return float(obj)
except ValueError,TypeError:
pass
改进:
>>> def safe_float(obj):
try:
a=float(obj)
except ValueError:
a=None
return a
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'
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'])
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'
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 #无法如何都执行