第6章 错误处理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第二个except永远也捕获不到UnicodeError,因为 UnicodeError是ValueError的子类,所有属于UnicodeError异 常被第一个捕获
6.1.3 Python中的异常类
BaseException
SystemExit
Exception
KeyboardInterrupt
6.2 with语句
with语句在Python2.6中开始引入,目的是简化类似于tryexcept-finally这样的代码。 with 语句适用于对资源进行访问的场合,确保不管使用 过程中是否发生异常都会执行必要的“清理”操作,释 放资源,比如文件使用后自动关闭、线程中锁的自动获 取和释放等。 with只有在支持上下文管理器的对象环境下,才能使用。
异常名称 BaseException SystemExit KeyboardInterrupt Exception StopIteration GeneratorExit StandardError ArithmeticError FloatingPointError OverflowError ZeroDivisionError AssertionError AttributeError EOFError EnvironmentError IOError 描述 所有异常类的直接或间接基类 程序请求退出时抛出的异常 用户中断执行(通常是输入Ctrl+C)时抛出 常规错误的直接或间接基类 迭代器没有更多的值 生成器发生异常,通知退出 内建标准异常的基类 所有数值计算错误的基类 浮点运算错误 数值运算超出最大限制 除零导致的异常 断言语句失败 对象没有这个属性 到达EOF 标记 操作系统错误的基类 输入/输出失败
2019/2/24
6.1.2 捕获与处理异常
try: <可能出现异常的语句块> except: <异常类名字name1>: <异常处理语句块1> #如果在try部份引发了'name1'异常,执行这部分语句 except: <异常类名字name2>,<数据>: <异常处理语句块2> #如果引发了'name2'异常,获得附加的数据 … except: <异常处理语句块n> #如果引发了异常,但与上述异常都不匹配,执行此语句块 else: <else语句块> #如果没有上述所列的异常发生,执行else语句块 finally: <始终执行的语句块>
2019/2/24
# -*- coding: utf-8 -*try: print('try...') r = 10 / 0 print('result:', r) except ZeroDivisionError as e: print('except:', e) finally: print('finally...') print('END')
2019/2/24
6.2.1 上下文管理器
上下文管理器(Context Manager):支持上下文管理协议的对 象,这种对象实现了__enter__() 和 __exit__() 方法。 __enter__() 方法在语句体执行之前进入运行时上下文, __exit__() 在语句体执行完后从运行时上下文退出 支持上下文对象:
不同异常类型注意问题
Python的捕获的异常也是class,所有的异常类型都继承自 BaseException,所以在使用except时需要注意的是,不同 异常类型不能有父类-子类如:
try:
foo() except ValueError as e: print('ValueError') except UnicodeError as e: print('UnicodeError’)
不同类型的异常匹配
# -*- coding: utf-8 -*try: a = input("请输入一个整数:") r = 10 / int(a) print('result:', r) except ValueError as e:#当输入非整数时,匹配异常 print('ValueError:', e) except ZeroDivisionError as e:#当输入为0时 print('ZeroDivisionError:', e) else: print('no error!') finally: print('finally...') print('END')
2019/2/24
如果try语句块的某一语句里发生了异常,却没有匹配的 except子句,也没有不带匹配类型的except部分,则异常将 往上被递交到上一层的try/except语句进行异常处理,或者 直到将异常传递给程序的最上层,从而结束程序。 如果try语句块中的任何语句在执行时没有发生异常, Python将执行else语句后的语句块。 执行完except后的异常处理语句或else后面的语句块后,程 序一定会执行finally后面的语句块。这里的语句块主要用 来进行收尾操作,无论是否出现异常都将被执行。 一个异常处理模块至少有一个try和一个except语句块,else 和finally语句块是可选的。
StandardError
ArithmeticError
EnvironmentError
RuntimeError
LookupError
SyntaxError
ZeroDivisionError
IOError
OSError
IndexError
KeyError
IndentationError
Python中内置的标准异常
2019/2/24
try/except语句用来检测try语句块中的异常,让except语 句捕获异常信息并处理。
try中的语句块先执行。如果try语句块中的某一语句执行 时发生异常,Python就跳到except部分,从上到下判断抛 出的异常对象是否与except后面的异常类相匹配,并执行 第一个匹配该异常的except后面的语句块,异常处理完毕 。 如果异常发生了,但是没有找到匹配的异常类别,则执 行不带任何匹配类型的except语句后面的语句块,异常处 理完毕。
源自文库
传入无效的参数 Unicode 相关的错误 Unicode 解码时的错误 Unicode 编码时错误 Unicode 转换时错误 警告的基类 被弃用的特征的警告 关于构造将来语义会有改变的警告 自动提升为长整型的警告 特性将会被废弃的警告 可疑的运行时行为的警告 可疑的语法警告 用户代码生成警告
2019/2/24
6.1.4 抛出异常
因为错误是class,捕获一个错误就是捕获到该class的一个 实例。因此,错误并不是凭空产生的,而是有意创建并 抛出的。Python的内置函数会抛出很多类型的错误,我 们自己编写的函数也可以抛出错误。 如果要抛出错误,首先根据需要,可以定义一个错误的 class,选择好继承关系,然后,用raise语句抛出一个错误 的实例:
2019/2/24
对比 try语句
try: f = open("1.py",'r',encoding='utf-8') for line in f: print(line) finally: f.close() 注意需要close()
nested 函数
nested 可以将多个上下文管理器组织在一起,避免使用 嵌套 with 语句。
ValueError UnicodeError UnicodeDecodeError UnicodeEncodeError UnicodeTranslateError Warning DeprecationWarning FutureWarning OverflowWarning PendingDeprecationWarning RuntimeWarning SyntaxWarning UserWarning
6.1.5 异常机制特点
调用栈 在调用栈中,可以跨越多层调用,比如函数main()调用 foo(),foo()调用bar(),结果bar()出错了,这时,只要 main()捕获到了,就可以处理: 如果错误没有被捕获,它就会一直往上抛,最后被 Python解释器捕获,打印一个错误信息,然后程序退出 。来看
第6章 错误处理
6.1 异常处理
Python提供了异常和断言来处理程序在运行过程中出现 的异常和错误 异常是在程序执行过程中发生的影响程序正常执行的一 个事件。 异常是Python对象,当Python无法正常处理程序时就会抛 出一个异常。 一旦Python脚本发生异常,程序需要捕获并处理它,否 则程序会终止执行。异常处理使程序能够处理完异常后 继续它的正常执行,不至于使程序因异常导致退出或崩 溃。
2019/2/24
操作系统错误 操作系统调用失败 导入模块/对象失败 LookupError异常是索引、值不存在引 发的异常, 是IndexError、KeyError的基类 序列中没有此索引 映射中没有这个键 内存溢出错误 未声明、未初始化对象 访问未初始化的本地变量 弱引用试图访问已经垃圾回收了的对象 一般的运行时错误 尚未实现的方法 Python 语法错误 缩进错误 Tab 和空格混用 一般的解释器系统错误 对类型无效的操作
OSError WindowsError ImportError LookupError IndexError KeyError MemoryError NameError UnboundLocalError ReferenceError RuntimeError NotImplementedError SyntaxError IndentationError TabError SystemError TypeError
with nested(A(), B(), C()) as (X, Y, Z): # with-body code here 类似于: with A() as X: with B() as Y: with C() as Z: # with-body code here
6.1.4异常抛出
语法:
raise 异常对象
抛出异常对象可以使用:
标准模块中的异常类 自定义一些异常类 通过扩展BaseException类或其子类来创建自定义异常类
2019/2/24
class FooError(ValueError): pass
def foo(s): n = int(s) if n==0: raise FooError('invalid value: %s' % s) return 10 / n try: foo('0') except FooError as e: print('FooError!')
6.1 异常处理
6.1.1 基本概念
将异常的检测与处理分离。
当本函数运行出现异常时,可以不在本函数处理,而是发出异 常信息(抛出异常);调用者可以捕捉到这一个信息(捕获 异常);根据对应的出错信息进行相应的处理(处理异常); 当然调用者也可以不作处理,而向更上一层调用发出异常信息 (再次抛出异常)。这样可以使底层函数专门解决于实际的 任务,而在能够对异常处理的层次再进行处理。
with语句语法
with语句的语法如下:
with context-expression [as var]: with语句块 with后面为表达式返回的是一个上下文管理器对象,使用as 可以 将这个结果赋值给某个变量
with open("1.py",'r',encoding='utf-8') as f: for line in f: print(line) 不管在处理文件过程中是否发生异常,都能保证 with 语句 执行完毕后已经关闭了打开的文件句柄。
file decimal.Context thread.LockType threading.Lock threading.RLock threading.Condition threading.Semaphore threading.BoundedSemaphore