8+Python程序设计+异常处理结构与程序调试
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 例外产生之后,需要有相应的处理。如果没有相应的except处理块,代码的 执行顺序会发生改变,直到找到相应的except处理块或者程序退出为止。
def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally:
Try again... Try again... Try again...
try.......except :示例2
>>> try:
raise Exception('spam', 'eggs')
except Exception as inst:
print(type(inst)) # the exception instance
except ZeroDivisionError: print('除数不能为零')
except TypeError: print('被除数和除数应为数值类型')
except NameError: print('变量不存在')
else: print(x, '/', y, '=', z)
带有多个except的try :示例2
# unpack args
print('x =', x)
print('y =', y)
<class 'Exception'> ('spam', 'eggs') ('spam', 'eggs') x = spam y = eggs
8.3.2 try.......except .......else:示例1
Please enter a number: a That was no valid number. Please enter a number: b That was no valid number. Please enter a number: c That was no valid number. Please enter a number: 10
• 分析
• 功能:读取并输出文件的内容。 • 在出现例外的情况下,执行红色的print语句后,结束程序的执行; • 在没有例外的情况下,执行else块的内容。
8.3.3 带有多个except的try结构
try: try_block
except Exception1: except_block_1
except Exception2: except_block_2
print(inst.args)
# arguments stored in .args
print(inst)
# __str__ allows args to be printed directly,
# but may be overridden in exception subclasses
x, y = inst.args
• 异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段 是检测并处理阶段。
• 不建议使用异常来代替常规的检查,如if...else判断。 • 应避免过多依赖于异常处理机制。 • 当程序出现错误,python会自动引发异常,也可以通过raise显式地引
发异常。
8.2 Python中的异常类
...
#被监控的语句 #处理异常1的语句 #处理异常2的语句
• 功能:
• 根据实际产生的例外,执行其中的例外程序块。
带有多个except的try:示例1
• 典型例子:除法。
try: x=int(input('请输入被除数: ')) y=int(input('请输入除数: ')) z=float(x) / y
print("executing finally clause")
>>> divide(2, 1) result is 2.0 executing finally clause >>> divide(2, 0) division by zero! executing finally clause >>> divide("2", "1") executing finally clause Traceback (most recent call last):
finally: f.close()
Traceback (most recent call last): File "<pyshell#17>", line 6, in <module> f.close()
NameError: name 'f' is not defined
try.......except .......finally:示例2
• 也可以使用异常处理结构为用户提供更加友好的提示。
• 程序出现异常或错误之后是否能够调试程序并快速定位和解决存 在的问题也是程序员综合水平和能力的重要体现方式之一。
8.1 什么是异常
• 语法错误和逻辑错误不属于异常,但有些语法错误往往会导致异常, 例如由于大小写拼写错误而访问不存在的对象。
• 当Python检测到一个错误时,解释器就会指出当前流已无法继续执行 下去,这时候就出现了异常。异常是指因为程序出错而在正常控制流 以外采取的行为。
i = int(s.strip())
except OSError as err:
except (OSError, ValueError,
print("OS error: {0}".format(err))
RuntimeError, NameError):
except ValueError:
pass
print("Could not convert data to an integer.")
File "<stdin>", line 1, in <module> File "<stdin>", line 3, in divide TypeError: unsupported operand type(s) for /: 'str' and 'str'
try.......except .......finally:示例3
8.3.1 try.......except结构
• 这是最基本的处理结构; • 具有两种形式。
代码处理形式一
try: try_block #被监控的代码
except Exception[,reason]: except_block #异常处理代码
代码处理形式二 try:
... except BaseException,e:
• 典型例程:文件的读取。
• 完美代码?
try: f = open('sample.txt', 'r') line = f.readline( ) print(line)
finally: f.close()
• 如 产果 生文 异件常没。有创建,则在finally中会
>>> try: f = open('sample2.txt', 'r') line = f.readline() print(line)
第8章 异常处理结构与程序调试
异常(exception)
• 简单地说,异常是指程序运行时引发的错误。引发错误的原因有 很多,例如除零、下标越界、文件不存在、网络异常、类型错误、 名字错误、字典键错误、磁盘空间不足,等等。
• 如果这些错误得不到正确的处理将会导致程序终止运行,而合理 地使用异常处理结果可以使得程序更加健壮,具有更强的容错性, 不会因为用户不小心的错误输入或其他运行时原因而造成程序终 止。
File "<stdin>", line 1, in ? __main__.MyError: 'oops!'
8.3 Python中的异常处理结构
• 常见的异常处理结构
• try.......except结构 • try.......except .......else结构 • 带有多个except的try结构 • try.......except .......finally结构
break
• 分析上述的代码
• 输入错误:例来自百度文库输入了非数值,或者输入的数值超出了正常的序号,会 产生异常;执行红色print语句,并继续循环;
• 其他的情况:输出列表中正确的字符串,并且退出循环。
try.......except .......else:示例2
for arg in sys.argv[1:]: try: f = open(arg, 'r') except IOError: print('cannot open', arg) else: print(arg, 'has', len(f.readlines()), 'lines') f.close()
自定义异常类
• 下面的例子演示了自定义的异常类
• 必须继承Exception类:所有异常类的基类;
class MyError(Exception): def __init__(self, value): self.value = value def __str__(self): return repr(self.value)
>>> try: raise MyError(2*2)
except MyError as e: print('My exception occurred,
value:', e.value) My exception occurred, value: 4 >>> raise MyError('oops!') Traceback (most recent call last):
except_block
优势:能够处理所有的异常
• 建议
• 尽量显式捕捉可能会出现的异常,并编写具有针对性的代码; • 最后一个except用来捕捉BaseException。
try.......except :示例1
>>> while True: try: x = int(input("Please enter a number: ")) break except ValueError: print("That was no valid number. Try again...")
• 当有多个except块而且处理相同时,可以使用元组的形式处理。
import sys
import sys
try:
try:
f = open('sample.txt')
f = open('sample.txt')
s = f.readline()
s = f.readline()
i = int(s.strip())
except:
print("Unexpected error:", sys.exc_info()[0])
raise
8.3.4 try.......except .......finally结构
• 特点
• Finally中的语句总会执行; • 可以用于清理工作,以便释放资源。
• 典型结构如下
try: try_block
• 下面列出了常用的异常类
抛出异常raise语句
• 主动抛出异常
• 定义自己的异常类时; • 或者需要抛出异常时。
• raise语法
raise [SomeException [, args [,traceback]]
• SomeException:必须是一个异常类,或异常类的实例; • Args:传递给SomeException的参数,必须是一个元组; • Traceback:很少用,主要是用来提供一个traceback对象。
except: except_block
finally: finally_block
#被监控的代码 #例外处理程序块 #无论如何都会执行
典型例子 >>> try:
3/0 except:
print(3) finally:
print(5) 3 5
try.......except .......finally:示例1
a_list = ['China', 'America', 'England', 'France'] while True:
print('请输入字符串的序号')
n = int(input()) try:
print(a_list[n]) except IndexError:
print('列表元素的下标越界,请重新输入字符串的序号') else: