第10章 错误和异常(2)

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>)
>>> 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值