10.3.6 “异常参数”
except Exception[, reason]:
suite_for_Exception_with_Argument
reason将会是一个包含来自导致异常的代码的诊断信息的类实例。异常参数自身会组成一个元组,并存储为类实例的属性。如上,reason将会是一个Exception类的实例。
无论reason只包含一个字符串或是由错误编号和字符串组成的元组,调用str(reason)总会返回一个良好可读的错误原因。
10.3.7 在应用使用我们封装的函数
.py codes:
def safe_float(obj):
'safe version of float()'
try:
retval = float(obj)
except (ValueError, TypeError), e:
retval = str(e)
return retval
def main():
'handles all the data processing'
import os
os.chdir("C:\\Documents and Settings\\10170660\\Desktop")
log = open('cardlog.txt', 'w')
try:
ccfile = open('carddata.txt', 'r')
except IOError, e:
log.write('No txns this month\n')
log.close()
return
txns = ccfile.readlines()
ccfile.close()
total=0.00
log.write('account log:\n')
for eachTxn in txns:
result = safe_float(eachTxn)
if isinstance(result, float):
total += result
log.write('data... processed\n')
else:
log.write('ignored: %s' % result)
print '$%.2f (new balance)'% total
log.close()
main()
C:\Documents and Settings\10170660\Desktop\carddata.txt:
previous balance
25
debits
21.64
541.24
25
credits
-25
-541.24
finance charge/late fees
7.30
5
10.3.8 else子句
在try范围中没有异常被检测到时,执行else子句。在else范围中的任何代码运行前,try范围中的所有代码必须完全成功,也就是结束前没有引发异常。
10.3.9 finally子句
finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。
10.3.10 try-finally语句
它常常用来维持一致的行为而无论异常是否发生。无论try中是否有异常触发,finally代码段都会被执行。
10.4 上下文管理
10.4.1 with语句
with语句的目的在于从流程图中把try、except和finally关键字和资源分配释放代码统统去掉,而不要像try-except-finally那样仅仅简化代码使之易用。 类似于C#中的using语句。
>>> with open('C:\\Documents and Settings\\10170660\Desktop\\carddata.txt', 'r') as f:
... for eachline in f:
... print eachline
...
10.6 触发异常
raise语句是Python提供的一种机制让程序员明确的触发异常。
raise [SomeException [, args [, traceback]]]
第2个符号为可选的args(比如参数,值),来传给异常。这可以是一个单独的对象也可以是一个对象的元组。
10.7 断言
断言是一句必须等价于布尔值的判定;此外,发生异常也意味着表达式为假。
断言语句等价于这样的Python表达式,如果断言成功不采取任何措施(类似语句),否则触发AssertionError(断言错误)的异常.
assert expression [, arguments]
10.8 标准异常
所有的标准/内建异常都是从根异常派生的。目前有3个直接从BaseException派生的异常子类:System.Exit, KeyboardInterrupt和Exception。其他所有的内建异常都是Exception的子类。
10.12 异常和sys模块
另一种获取异常信息的途径是通过sys模块中exc_info()函数。此功能提供了一个3元组(3-tuple)的信息,多于我们单纯用异常参数所能获得。
>>> try:
... float("ad")
... except BaseException:
... import sys
... exc_tuple = sys.exc_info()
... print exc_tuple
...
(<type 'exceptions.ValueError'>, ValueError('could not convert string to float: ad',), <traceback object at 0x013B7EB8>)
>>>