1、python中的异常案例
1.1 NameError: 尝试访问一个未定义/未申明的变量
1.2 ZeroDivisionError: 除数为0
1.3 SyntaxError: 语法错误
1.4 IndexError: 请求的索引超过序列范围
1.5 Keyerror: 不存在的字典关键字
1.6 IOError: 输入输出错误,类似打开一个不存在的文件时会引发此类错误
1.7 AttributeError: 访问未知的对象属性或方法
2. 检测和处理异常
2.1 try-except 语句
最常见的try-except语句由try块和except块构成,语法如下
try: try_suite #监控这里发生的异常 except Exception[,reason]: except_suite #发生指定的异常后在这里处理,执行此处代码
2.2 可以把多个except语句连接在一起,处理一个try语句块可能发生的多种异常。这种情况下,首先尝试 try 子句,如果没有异常就跳过所有 except 从句继续执行;否则,在多个 except 子句中查找匹配的异常执行相应语句,若找不到匹配异常,则中断执行抛出错误。
2.3 我们还可以在一个 except 语句里处理任意多个异常,只需要把它们放进一个元组里。
2.4 有部分错误并不是由于错误条件引起,而是由于系统原因,比如用户按下 CTRl-C 退出 python 引发的KeyboardInterupt。如果捕获所有异常,则会导致此类异常也被捕获。故 python 2.5 以后的版本推出了 BaseException 作为所有异常的父类, Exception 作为一个子类处理真正的异常。其语法介绍:
try: pass except Exception, e: pass # 处理错误的条件引发的错误和异常 try: pass except BaseException, e: pass # 处理所有发生的错误和异常
2.5 信用卡交易系统例子
#!/usr/bin/env python # -*- coding:utf-8 -*- def safe_float(obj): u'float() 的安全版' try: retval = float(obj) except (ValueError, TypeError), diag: retval = str(diag) return retval def main(): u'处理所有的数据' 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.0 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() if __name__ == '__main__': main()
注: carddata.txt 内容如下:
执行后结果:
E:\code\Core Python Programming\10\Notes\eg python cardrun.py $58.94 (new balance)
生成的cardlog.txt内容:
2.6 try-except语句可以跟 else 从句,类似循环中 else 从句执行条件,当 try 中的语句块没有引发任何异常时,执行 else 语句。否则执行相应的 except 语句或抛出异常, else 语句被跳过。
finally 子句则是无论异常是否发生、是否被 except 语句处理都会执行的一段代码
3.上下文管理
3.1 with 语句
with 语句语法如下:
with open(r'E:\Test') as f: for eachline in f: pass # do something to f or eachline
这段代码试图打开一个文件并赋值给f。若一切正常,文件对象被赋值给f并进行下面的迭代步骤,在下面步骤完成后关闭文件;否则,无论在何时发生异常,均执行清理代码并关闭文件。
4.触发异常
4.1 raise 语句是Python提供的一种机制,用于让程序员能够在遇到错误的输入时明确的触发异常。其用法和语法如下:
5.断言
断言用来测试一个表达式返回值的真假,若为真不采取任何操作,若为假则抛出 AssertionError 。语法实例如下:
>>> assert 1 == 1 >>> assert 1 == 0 Traceback (most recent call last): File "<stdin>", line 1, in (module) AssertionError
6.标准异常
Python内建的所有异常类型如下