第8章 程序调试和异常处理
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下列案例使用一个except语句处理所有的异常。 >>>a = [100, 200, 300,400] >>>def getn(n): try: if n < 200: data = s[4] else: file = open(100,200,300,400) except: print ("捕获所有的异常")
第8章 程序调试和异常处理
本章内容
8.1 什么是异常 8.2 常见错误和异常 8.3 熟悉内置异常 8.4 使用try…except语句处理异常 8.5 全捕捉 8.6 异常中的else 8.7 异常中的pass 8.8 异常类的实例 8.9 清除异常 8.10 抛出异常 8.10.1 raise语句 8.10.2 结束解释器的运行 8.10.3 离开嵌套循环 8.11 自定义异常 8.12 程序调试 8.12.1 使用assert语句 8.12.2 使用__debug__内置变量
8.9 清除异常
句一定会被运行。注意try与except语句可以搭配使用 ,try与finally语句也可以搭配使用,但是except与 finally语句不可以放在一起。 下列案例没有异常发生,fanally语句内的程序代码还 是被运行。 >>>try: a = 100 finally: print ('异常已经清除啦')
8.1 什么是异常
程序运行过程中,总会遇到各种各样的错误。有的错误是程序编 写有问题造成的,例如本来该输出字符串结果输出整数,这种错 误通常称之为bug,bug是必须修复的。 有的错误是用户输入造成的,比如让用户输入email地址,结果得 到一个空字符串,这种错误可以通过检查用户输入来做相应的处 理。 还有一类错误是完全无法在程序运行过程中预测的,比如写入文 件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络 突然断掉了。这类错误也称为异常,在程序中通常是必须处理的 ,否则,程序会因为各种问题终止并退出。
8.10.2 结束解释器的运行
用户可以利用输出SystemExit异常,来强迫 结束Python解释器的运行。如图8-41所示 : C:\Users\Administrator>python >>>raise SystemExit 使用sys.exit()函数会输出一个SystemExit异 常,sys.exit()函数会结束线程。
8.12.2 使用__debug__内置变量
Python解释器有一个内置变量__debug__ ,__debug__在正常情况下的值是True。 >>> __debug__ True 当用户以最佳化模式启动Python解释器时 ,__debug__值为False。要使用最佳化模 式启动Python解释器,须设置Python命令 行选项-O。
.2 常见错误和异常
在Python编程中,最常见的错误和异常如下: 1. 缺少冒号引起错误 2. 将赋值运算符=和比较运算符==混淆 3. 代码结构的缩进错误 4. 修改元祖和字符串的值时报错 5. 连接字符串和非字符串 6. 在字符串首尾忘记加引号 7. 变量或者函数名拼写错误 8. 引用超过列表的最大索引 9. 使用关键字作为变量名 10. 变量没有初始值就使用增值操作符
8.12 程序调试
8.12.1 使用assert语句 8.12.2 使用__debug__内置变量
8.12.1 使用assert语句
通过使用assert语句,可以帮助用户检测程序代码中的 错误。assert语句的语法如下所示: assert <测试码> [, 参数] 测试码是一段返回True或是False的程序代码。如果测 试码返回true,则继续运行后面的程序代码。如果测试 码返回false,assert语句会输出一个AssertionError异 常。并且输出assert语句的[参数],作为错误信息字符 串。
8.6 异常中的else
下列案例使用else语句,处理没有异常时的情况。注意使用else语 句时,一定要有except语句才行。 >>>def get(n): try: if n == 100: data = s[4] elif 200 <= n <= 500: file = open(100,200,300) except: print ("有错误发生") else: print ("没有错误发生")
8.4 使用try…except语句处理异常
try: <语句> except [<异常的名称> [, <异常类的实例变量 名称>]]: <异常的处理语句> [else: <没有异常产生时的处理语句>] 在中括号[]之内的语法,表示是可以省略的。
8.5 全捕捉
8.10 抛出异常
8.10.1 raise语句 8.10.2 结束解释器的运行 8.10.3 离开嵌套循环
8.10.1 raise语句
Python使用raise 语句抛出一个指定的异常 。例如: >>>raise NameError('这里使用raise抛出 一个异常') raise 唯一的一个参数指定了要被抛出的异 常。它必须是一个异常的实例或者是异常的 类(也就是Exception的子类)。
8.8 异常类的实例
每当有一个异常被输出时,该异常类就会创 建一个实例,此实例继承了异常类的所有属 性。每一个异常类实例,都有一个args属性 。args属性是一个元组格式,这个元组格式 可能只包含错误信息的字符串(1-tuple),也 可能包含2个以上的元素(2-tuple,3-tuple ,...)。异常类的不同,这个元组格式也不同 。
8.7 异常中的pass
用户可以在except语句内使用pass语句,来忽略所发生的异常。 下列案例将列表a内的所有元素相加,并且输出元素相加的总和。 >>>a = ["100", "200", "苹果", "香蕉", "100"] >>>sm = 0 >>>for n in a: try: sm += int(n) except: pass
8.3 熟悉内置异常
(1) BaseException:所有异常的基类。(2) SystemExit:解释器请求退出(3) KeyboardInterrupt:用户中断 执行(4) Exception 常规错误的基类(5) StopIteration 迭代器没有更多的值(6) GeneratorExit 生成器 (generator)发生异常来通知退出(7) SystemExit Python解释器请求退出(8) StandardError 所有的内置标准 异常的基类(9) ArithmeticError 所有数值计算错误的基类(10) FloatingPointError 浮点计算错误(11) OverflowError 数值运算超出最大限制(12) ZeroDivisionError 除(或取模)零 (所有数据类型)(13) AssertionError 断言语句失败(14) AttributeError 对象没有这个属性(15) EOFError 没有内建输入,到达EOF 标记(16) EnvironmentError 操作系统错误的基类(17) IOError 输入/输出操作失败 (18) OSError 操作系统错误(19) WindowsError 系统调用失败(20) ImportError 导入模块/对象失败(21) KeyboardInterrupt 用户中断执行(通常是输入^C)(22) LookupError无效数据查询的基类(23) IndexError序 列中没有没有此索引(index)(24) KeyError映射中没有这个键 (25) MemoryError内存溢出错误(对于Python 解释器不是致命的)(26) NameError未声明/初始化对象 (没有 属性)(27) UnboundLocalError访问未初始化的本地变量(28) ReferenceError弱引用(Weak reference)试图访 问已经垃圾回收了的对象(29) RuntimeError一般的运行时错误(30) NotImplementedError尚未实现的方法 (31) SyntaxError Python 语法错误(32) IndentationError 缩进错误(33) TabError Tab 和空格混用(34) SystemError 一般的解释器系统错误(35) TypeError 对类型无效的操作(36) ValueError 传入无效的参数 (37) UnicodeError Unicode 相关的错误(38) UnicodeDecodeError Unicode 解码时的错误 (39) UnicodeEncodeError Unicode 编码时错误(40) UnicodeTranslateError Unicode 转换时错误(41) Warning 警告的基类(42) DeprecationWarning 关于被弃用的特征的警告 (43) FutureWarning 关于构造将来语义会有改变的警告(44) OverflowWarning 旧的关于自动提升为长整型 (long)的警告(45) PendingDeprecationWarning 关于特性将会被废弃的警告(46) RuntimeWarning 可疑 的运行时行为(runtime behavior)的警告(47) SyntaxWarning 可疑的语法的警告(48) UserWarning 用户代 码生成的警告
8.10.3 离开嵌套循环
前面章节的学习中,如果想离开循环的时候 ,通常是使用break语句。如果在一个嵌套 循环之内,break语句只能离开最内层的循 环,而不能离开嵌套循环,此时可以使用 raise语句离开嵌套循环。
8.11 自定义异常
除了内置异常,Python也支持用户定义的异常。用户定义的异常与内置 异常并无差别,只是内置异常是定义在exceptions模块中。当Python解 释器启动时,exceptions模块就会事先加载。 Python允许用户定义自己的异常类,用户定义的异常类必须是从任何一 个Python的内置异常类派生而来。 下列案例使用Python的内置Exception异常类作为基类,创建一个用户定 义的异常类URLError。 >>>class URLError(Exception): pass >>>try: raise URLError("这是URL异常") except URLError as inst: print(inst.args[0])
第8章 程序调试和异常处理
本章内容
8.1 什么是异常 8.2 常见错误和异常 8.3 熟悉内置异常 8.4 使用try…except语句处理异常 8.5 全捕捉 8.6 异常中的else 8.7 异常中的pass 8.8 异常类的实例 8.9 清除异常 8.10 抛出异常 8.10.1 raise语句 8.10.2 结束解释器的运行 8.10.3 离开嵌套循环 8.11 自定义异常 8.12 程序调试 8.12.1 使用assert语句 8.12.2 使用__debug__内置变量
8.9 清除异常
句一定会被运行。注意try与except语句可以搭配使用 ,try与finally语句也可以搭配使用,但是except与 finally语句不可以放在一起。 下列案例没有异常发生,fanally语句内的程序代码还 是被运行。 >>>try: a = 100 finally: print ('异常已经清除啦')
8.1 什么是异常
程序运行过程中,总会遇到各种各样的错误。有的错误是程序编 写有问题造成的,例如本来该输出字符串结果输出整数,这种错 误通常称之为bug,bug是必须修复的。 有的错误是用户输入造成的,比如让用户输入email地址,结果得 到一个空字符串,这种错误可以通过检查用户输入来做相应的处 理。 还有一类错误是完全无法在程序运行过程中预测的,比如写入文 件的时候,磁盘满了,写不进去了,或者从网络抓取数据,网络 突然断掉了。这类错误也称为异常,在程序中通常是必须处理的 ,否则,程序会因为各种问题终止并退出。
8.10.2 结束解释器的运行
用户可以利用输出SystemExit异常,来强迫 结束Python解释器的运行。如图8-41所示 : C:\Users\Administrator>python >>>raise SystemExit 使用sys.exit()函数会输出一个SystemExit异 常,sys.exit()函数会结束线程。
8.12.2 使用__debug__内置变量
Python解释器有一个内置变量__debug__ ,__debug__在正常情况下的值是True。 >>> __debug__ True 当用户以最佳化模式启动Python解释器时 ,__debug__值为False。要使用最佳化模 式启动Python解释器,须设置Python命令 行选项-O。
.2 常见错误和异常
在Python编程中,最常见的错误和异常如下: 1. 缺少冒号引起错误 2. 将赋值运算符=和比较运算符==混淆 3. 代码结构的缩进错误 4. 修改元祖和字符串的值时报错 5. 连接字符串和非字符串 6. 在字符串首尾忘记加引号 7. 变量或者函数名拼写错误 8. 引用超过列表的最大索引 9. 使用关键字作为变量名 10. 变量没有初始值就使用增值操作符
8.12 程序调试
8.12.1 使用assert语句 8.12.2 使用__debug__内置变量
8.12.1 使用assert语句
通过使用assert语句,可以帮助用户检测程序代码中的 错误。assert语句的语法如下所示: assert <测试码> [, 参数] 测试码是一段返回True或是False的程序代码。如果测 试码返回true,则继续运行后面的程序代码。如果测试 码返回false,assert语句会输出一个AssertionError异 常。并且输出assert语句的[参数],作为错误信息字符 串。
8.6 异常中的else
下列案例使用else语句,处理没有异常时的情况。注意使用else语 句时,一定要有except语句才行。 >>>def get(n): try: if n == 100: data = s[4] elif 200 <= n <= 500: file = open(100,200,300) except: print ("有错误发生") else: print ("没有错误发生")
8.4 使用try…except语句处理异常
try: <语句> except [<异常的名称> [, <异常类的实例变量 名称>]]: <异常的处理语句> [else: <没有异常产生时的处理语句>] 在中括号[]之内的语法,表示是可以省略的。
8.5 全捕捉
8.10 抛出异常
8.10.1 raise语句 8.10.2 结束解释器的运行 8.10.3 离开嵌套循环
8.10.1 raise语句
Python使用raise 语句抛出一个指定的异常 。例如: >>>raise NameError('这里使用raise抛出 一个异常') raise 唯一的一个参数指定了要被抛出的异 常。它必须是一个异常的实例或者是异常的 类(也就是Exception的子类)。
8.8 异常类的实例
每当有一个异常被输出时,该异常类就会创 建一个实例,此实例继承了异常类的所有属 性。每一个异常类实例,都有一个args属性 。args属性是一个元组格式,这个元组格式 可能只包含错误信息的字符串(1-tuple),也 可能包含2个以上的元素(2-tuple,3-tuple ,...)。异常类的不同,这个元组格式也不同 。
8.7 异常中的pass
用户可以在except语句内使用pass语句,来忽略所发生的异常。 下列案例将列表a内的所有元素相加,并且输出元素相加的总和。 >>>a = ["100", "200", "苹果", "香蕉", "100"] >>>sm = 0 >>>for n in a: try: sm += int(n) except: pass
8.3 熟悉内置异常
(1) BaseException:所有异常的基类。(2) SystemExit:解释器请求退出(3) KeyboardInterrupt:用户中断 执行(4) Exception 常规错误的基类(5) StopIteration 迭代器没有更多的值(6) GeneratorExit 生成器 (generator)发生异常来通知退出(7) SystemExit Python解释器请求退出(8) StandardError 所有的内置标准 异常的基类(9) ArithmeticError 所有数值计算错误的基类(10) FloatingPointError 浮点计算错误(11) OverflowError 数值运算超出最大限制(12) ZeroDivisionError 除(或取模)零 (所有数据类型)(13) AssertionError 断言语句失败(14) AttributeError 对象没有这个属性(15) EOFError 没有内建输入,到达EOF 标记(16) EnvironmentError 操作系统错误的基类(17) IOError 输入/输出操作失败 (18) OSError 操作系统错误(19) WindowsError 系统调用失败(20) ImportError 导入模块/对象失败(21) KeyboardInterrupt 用户中断执行(通常是输入^C)(22) LookupError无效数据查询的基类(23) IndexError序 列中没有没有此索引(index)(24) KeyError映射中没有这个键 (25) MemoryError内存溢出错误(对于Python 解释器不是致命的)(26) NameError未声明/初始化对象 (没有 属性)(27) UnboundLocalError访问未初始化的本地变量(28) ReferenceError弱引用(Weak reference)试图访 问已经垃圾回收了的对象(29) RuntimeError一般的运行时错误(30) NotImplementedError尚未实现的方法 (31) SyntaxError Python 语法错误(32) IndentationError 缩进错误(33) TabError Tab 和空格混用(34) SystemError 一般的解释器系统错误(35) TypeError 对类型无效的操作(36) ValueError 传入无效的参数 (37) UnicodeError Unicode 相关的错误(38) UnicodeDecodeError Unicode 解码时的错误 (39) UnicodeEncodeError Unicode 编码时错误(40) UnicodeTranslateError Unicode 转换时错误(41) Warning 警告的基类(42) DeprecationWarning 关于被弃用的特征的警告 (43) FutureWarning 关于构造将来语义会有改变的警告(44) OverflowWarning 旧的关于自动提升为长整型 (long)的警告(45) PendingDeprecationWarning 关于特性将会被废弃的警告(46) RuntimeWarning 可疑 的运行时行为(runtime behavior)的警告(47) SyntaxWarning 可疑的语法的警告(48) UserWarning 用户代 码生成的警告
8.10.3 离开嵌套循环
前面章节的学习中,如果想离开循环的时候 ,通常是使用break语句。如果在一个嵌套 循环之内,break语句只能离开最内层的循 环,而不能离开嵌套循环,此时可以使用 raise语句离开嵌套循环。
8.11 自定义异常
除了内置异常,Python也支持用户定义的异常。用户定义的异常与内置 异常并无差别,只是内置异常是定义在exceptions模块中。当Python解 释器启动时,exceptions模块就会事先加载。 Python允许用户定义自己的异常类,用户定义的异常类必须是从任何一 个Python的内置异常类派生而来。 下列案例使用Python的内置Exception异常类作为基类,创建一个用户定 义的异常类URLError。 >>>class URLError(Exception): pass >>>try: raise URLError("这是URL异常") except URLError as inst: print(inst.args[0])