异常处理try..except..finally

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()__返回的内容来赋值;否则,丢弃返回值.在我们的文件对象

分割线

感谢打赏
江西数库信息技术有限公司
YWSOS.COM 平台代运维解决方案
 评论
 发表评论
姓   名:

Powered by AKCMS