您的位置:首页 > 编程语言 > Python开发

python错误和异常(1)

2013-08-29 19:47 218 查看
1 SyntaxError: Python解释器语法错误,是唯一不是在运行时发生的异常。

2 检测和处理异常

try语句有两种主要形式:try-except 和 try-finally. 只能二选一。

一个try语句可以对应一个或多个except子句,但只能对应一个finally子句。

try语句块中异常发生点后的剩余语句永远不会到达。

except后面相当于一个处理器,处理异常发生时应该怎么做。

异常或错误的处理流程:当一个异常被引发,剩余代码将会忽略,解释器搜索处理器,如果没有合适的处理器,那么异常就向上移交给调用者去处理,这意味着堆栈框架立即回到之前的那个,如果在上层调用者也没有找到对应的处理器,该异常会继续被向上提交,直到找到合适的处理器,如果到达最顶层仍然没有找到对应处理器,那么就认为这个异常是未处理的,python解释器会显示出跟踪返回消息,然后退出。

try-except语句可以连贯使用,这样可以处理多种异常。

def safe_float(obj):
try:
retval = float(obj)
except ValueError:
retval = 'could not convert non-number to float'
except TypeError:
retval = 'object type cannot be converted to float'
return retval


这样,safe_float()函数就可以分别处理ValueError和TypeError两种异常了。

python2.5以后,对于keyboardInterrupt和SystemExit两个异常(not real error),从Exception里移出,和Exception平级,这样当使用如下的catch_all代码时,就不比为这两个异常创建额外的处理器。

try:
....
except Exception, e:
#handle real errors


异常参数:异常引发后,它会被传递给异常处理器,作为附加帮助信息,一般包含一个指示错误原因的字符串元组。



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

try:
A
except MyException:
B
else:
C
finally:
D


上面这段代码有两种可能的执行顺序:

正常:A-C-D
异常:A-B-D

try-finally语句:这个语句不是用来捕获异常的。当try的语句块中有异常发生时,会立即跳转到finally语句段,当finally中的所有代码都执行完毕后,会继续向上一层引发异常。

try语句的嵌套:

ccfile = None
try:
tyr:
ccfile = open('cardata.txt', 'r')
txns = ccfile.readlines()
except IOError:
log.write('no txns this month\n')
finally:
if ccfile:
ccfile.close()
这样写的好处是,当readlines调用失败时,异常处理会去继续执行except中的子句,并且在finally子句中会去尝试关闭文件。

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

后面会接着讲到 with语句等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: