IndentationErrorm,SyntaxError无法捕获,原因是因为编译器无法编译
缩进错误,语法错误
要给你的代码添加错误检测及异常处理,只要将它们封装在 try-except 语句当中。 try
之后的代码组,就是你打算管理的代码。 except 之后的代码组,则是你处理错误的代码。
捕获异常:
try:
f=open(filename,'r')
except IOError,e:
return False,str(e)
try:
process_some_data()
except(TypeError,ValueError),e:
print "ERROR:you provide invalid data",e
try:
filename = raw_input('Enter file name: ')
fobj = open(filename, 'r')
for eachLine in fobj:
print eachLine, fobj.close()
except IOError, e:
print 'file open error:', e
SyntaxError: Python 解释器语法错误
ZeroDivisionError: 除数为零
NameError: 尝试访问一个未申明的变量
IndexError:请求的索引超出序列范围
KeyError:请求一个不存在的字典关键字
IOError: 输入/输出错误
AttributeError: 尝试访问未知的对象属性
检测和处理异常
异常可以通过 try 语句来检测. 任何在 try 语句块里的代码都会被监测, 检查有无异常发
生.
try 语句有两种主要形式: try-except和 try-finally .这两个语句是互斥的, 也就是说你
只能使用其中的一种. 一个 try 语句可以对应一个或多个 except子句, 但只能对应一个
finally 子句, 或是一个 try-except-finally 复合语句.
你可以使用 try-except语句检测和处理异常. 你也可以添加一个可选的 else 子句处理没
有探测到异常的时执行的代码. 而 try-finally只允许检测异常并做一些必要的清除工作(无论
发生错误与否), 没有任何异常处理设施. 正如你想像的,复合语句两者都可以做到.
try-except 语句
try:
try_suite # watch forexceptions here 监控这里的异常
except Exception[,reason]:
except_suite #exception-handling code 异常处理代码
在程序运行时, 解释器尝试执行 try 块里的所有代码, 如果代码块完成后没有异常发生, 执
行流就会忽略 except 语句继续执行. 而当 except 语句所指定的异常发生后, 我们保存了错误的
原因, 控制流立即跳转到对应的处理器( try 子句的剩余语句将被忽略), 本例中我们显示出一个包
含错误原因的错误信息.
#!/usr/bin/env python
try:
f = open('error.txt','r')
print 'rscpass@163.com'
except IOError,e:
print 'could not open file:',e
核心笔记: 忽略代码, 继续执行, 和向上移交
try 语句块中异常发生点后的剩余语句永远不会到达(所以也永远不会执行). 一旦一个异常被
引发, 就必须决定控制流下一步到达的位置. 剩余代码将被忽略,解释器将搜索处理器, 一旦找到,
就开始执行处理器中的代码.
如果没有找到合适的处理器,那么异常就向上移交给调用者去处理, 这意味着堆栈框架立即回
到之前的那个. 如果在上层调用者也没找到对应处理器,该异常会继续被向上移交, 直到找到合适
处理器. 如果到达最顶层仍然没有找到对应处理器, 那么就认为这个异常是未处理的, Python 解释
器会显示出跟踪返回消息, 然后退出.
>>>float(12345)
12345.0
>>>float('12345')
12345.0
>>>float('123.24e67')
1.2323999999999999e+69
def safe_float(obj):
try:
retval = float(obj)
except ValueError:
retval = 'could not convert non-number to float'
return retval
带有多个 except 的 try 语句
这种格式的 except语句指定检测名为 Exception的异常. 你可以把多个 except语句连接
在一起, 处理一个 try 块中可能发生的多种异常, 如下所示:
except Exception1[,reason1]:
suite_for_exception_Exception1
except Exception2[,reason2]:
suite_for_exception_Exception2
同样, 首先尝试执行 try 子句, 如果没有错误, 忽略所有的 except 从句继续执行. 如果
发生异常, 解释器将在这一串处理器(except 子句)中查找匹配的异常. 如果找到对应的处理器,
执行流将跳转到这里.
>>> defsafe_float(obj):
... try:
... retval = float(obj)
... except ValueError:
... retval = 'could not convertnon-number to float'
... except TypeError:
... retval = 'object type cannot beconverted to float'
... return retval
...
>>>safe_float({'rsc':'b'})
'object type cannot beconverted to float'
>>>safe_float('abc')
'could not convertnon-number to float'
>>>safe_float('123')
123.0
>>>safe_float(200l)
200.0
>>>safe_float(())
'object type cannot beconverted to float'
处理多个异常的 except 语句
except (Exception1,Exception2)[, reason]:
suite_for_Exception1_and_Exception2
except (Exc1[, Exc2[,... ExcN]])[, reason]:
suite_for_exceptions_Exc1_to_ExcN
如果由于其他原因, 也许是内存规定或是设计方面的因素, 要求 safe_float()函数中的所有
异常必须使用同样的代码处理, 那么我们可以这样满足需求:
>>> defsafe_float(obj):
... try:
... retval = float(obj)
... except (ValueError,TypeError):
... retval = 'argument must be anumber or numeric string'
... return retval
...
>>>safe_float(())
'argument must be anumber or numeric string'
>>>safe_float("adf")
'argument must be anumber or numeric string'
捕获所有异常
SystemExit 是由于当前 Python 应用程序需要退出, KeyboardInterupt 代表
用户按下了 CTRL-C (^C) , 想要关闭 Python .
try:
:
except Exception, e:
# error occurred, log'e', etc.
另一个我们不太推荐的方法是使用裸 except 子句:
try:
:
except:
# error occurred, etc.
try:
:
except(KeyboardInterupt, SystemExit):
# user wants to quit
raise # reraise back tocaller
except Exception:
# handle real errors
这样, 当你已经有了一个 Exception 处理器后, 你不必为这两个异常创建额外的处理器. 代
码将会是这样:
try:
:
except Exception, e:
# handle real errors
如果你确实需要捕获所有异常, 那么你就得使用新的 BaseException :
try:
:
except BaseException,e:
异常的参数可以在处理器里忽略, 但 Python 提供了保存这个值的语法. 我们已经在上边接触
到相关内容: 要想访问提供的异常原因, 你必须保留一个变量来保存这个参数. 把这个参数放在
except 语句后, 接在要处理的异常后面. except 语句的这个语法可以被扩展为:
# single exception
except Exception[,reason]:
suite_for_Exception_with_Argument
# multiple exceptions
except (Exception1,Exception2, ..., ExceptionN)[, reason]:
Edit By Vheavens
Edit By Vheavens
suite_for_Exception1_to_ExceptionN_with_Argument
else:
在 try 范围中没有异常被检测到时,执行 else 子
句.
在else 范围中的任何代码运行前,try 范围中的所有代码必须完全成功(也就是,结束前没有引发
异常
eg:
import 3rd_party_module
log =open('logfile.txt','w')
try:
3rd_party_module.function()
except:
log.write("**caught exception in module\n")
else:
log.write("*** no exceptions caught\n")
log.close()
finally 子句
finally 子句是无论异常是否发生,是否捕捉都会执行的一段代码.你可以将 finally 仅仅配合
try 一起使用,
try-except-else-finally
try:
A
except myexception:B
else:
C
finally:
D
无论异常发生在A,B,和/或C 都将执行finally 块
try-finally 语句
无论 try 中是否有异常触发,finally 代码段都会被执行
try:
try_suite
finally:
finally_suite#无论如何都执行
try-except-else-finally:厨房一锅端
try:
try_suite
except exception1:
suite_for_exception1
except(exception2,exception3,exception4):
suite_for_exceptions_2_3_and_4
exceptException5,Argument5:
suite_for_Exception5_plus_argument
except(exception6,exception7),argument67:
suite_for_exception6_and_7_plus_argument
except:
suite_for_all_other_exceptions
else:
no_exceptions_detected_suite
finally:
always_execute_suite
10.4 上下文管理
10.4.1 with 语句
语法:
with context_expr [asvar]:
with_suite
withopen('/etc/passwd', 'r') as f:
for eachLine in f:
# ...do stuff with eachLine or f...
上下文对象,with 语句块
一旦我们获得了上下文对象,就会调用它的__enter()__方法.它将完成 with 语句块执行前的所
有准备工作.你可以注意到在上面的 with 行的语法中有一个可选的 as 声明变量跟随在 context_expr
之后.如果提供提供了变量,以__enter()__返回的内容来赋值;否则,丢弃返回值.在我们的文件对象