欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPTX文档下载
     

    Python8 异常处理结构与程序调试ppt课件.pptx

    • 资源ID:1377819       资源大小:172.64KB        全文页数:33页
    • 资源格式: PPTX        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Python8 异常处理结构与程序调试ppt课件.pptx

    第8章 异常处理结构与程序调试,异常(exception),简单地说,异常是指程序运行时引发的错误。引发错误的原因有很多,例如除零、下标越界、文件不存在、网络异常、类型错误、名字错误、字典键错误、磁盘空间不足,等等。如果这些错误得不到正确的处理将会导致程序终止运行合理地使用异常处理结果可以使得程序更加健壮,具有更强的容错性,不会因为用户不小心的错误输入或其他运行时原因而造成程序终止。也可以使用异常处理结构为用户提供更加友好的提示。程序出现异常或错误之后是否能够调试程序并快速定位和解决存在的问题也是程序员综合水平和能力的重要体现方式之一。,8.1 什么是异常,语法错误和逻辑错误不属于异常(运行时错误),但有些语法错误往往会导致异常,例如由于大小写拼写错误而访问不存在的对象。当Python检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就出现了异常。异常是指因为程序出错而在正常控制流以外采取的行为。异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段是检测并处理阶段。不建议使用异常来代替常规的检查,如if.else判断。应避免过多依赖于异常处理机制。当程序出现错误,python会自动引发异常,也可以通过raise显式地引发异常。,8.2 Python中的异常类,下面列出了常用的异常类,抛出异常raise语句,主动抛出异常定义自己的异常类时;或者需要抛出异常时。raise语法expression:必须是一个异常类,或异常类的实例对象;如果为一个异常类,则相当于首先创建一个该类的实例,然后抛出该异常对象from expression2:给出了将两个异常连接起来的方法,表示异常是由于另一个expression2引起的。,raise expression from expression2,raise Exception raise Exception(foo occurred!)raise Exception(foo occurred!) from Exception(another error occured!),自定义异常类,下面的例子演示了自定义的异常类必须继承Exception类或者其子类: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, e) raise,My exception occurred 4Traceback (most recent call last): File C:/Users/dlmao/PycharmProjects/pythonClass/exception_demo.py, line 14, in raise MyError(2*2)MyError: 4,8.3 Python中的异常处理结构,第一种方式没有except块执行代码不管有没有异常执行finally块第二种方式至少有except块,else和finally可选expression应该为异常类或者异常类的元组,表示其中任一异常出现,try: finally: try: except expression as identifier: # 至少一次,在多次出现时不带表达式except应该是最后一个。按序匹配找到对应的exception为止 else: # 可选的,在没有异常出现在前面的异常都没有出现时执行 finally: # 可选的,不管异常有没有都要执行 ,8.3 Python中的异常处理结构,常见的异常处理结构try.except结构try.except .else结构带有多个except的try结构try.except .finally结构,try: finally: try: except expression as identifier: # 至少一次,在多次出现时不带表达式except应该是最后一个。按序匹配找到对应的exception为止 else: # 可选的,在没有异常出现在前面的异常都没有出现时执行 finally: # 可选的,不管异常有没有都要执行 ,8.3.1 try.except结构,这是最基本的处理结构;具有两种形式。,代码处理形式一try: try_block #被监控的代码except Exception1,reason: except_block #异常处理代码,代码处理形式二try: .except BaseException,e: 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.),Please enter a number: aThat was no valid number. Try again.Please enter a number: bThat was no valid number. Try again.Please enter a number: cThat was no valid number. Try again.Please enter a number: 10,try.except :示例2, try: raise Exception(spam, eggs)except Exception as inst: print(type(inst) # the exception instance 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 # unpack args print(x =, x) print(y =, y)print(x)print(inst),expression as instanceinstance为异常对象注意:在exception block并不是一个新的scope,但是instance在退出该block后不可用,(spam, eggs)(spam, eggs)x = spamy = eggsspamtraceback (most recent call last):UnboundLocalError: local variable inst referenced before assignment,8.3.2 try.except .else:示例1,分析上述的代码输入错误:例如输入的数值超出了正常的序号,会产生异常;执行红色print语句,并继续循环;但是输入了非数值?其他的情况:输出列表中正确的字符串,并且退出循环。,a_list = China, America, England, Francewhile True: print(请输入字符串的序号) n = int(input() try: print(a_listn) except IndexError: print(列表元素的下标越界,请重新输入字符串的序号) else: break,def except_else_1(): a_list = China, America, England, France while True: print(请输入字符串的序号) try: n = int(input() print(a_listn) except IndexError: print(列表元素的下标越界,请重新输入字符串的序号) except ValueError: print(输入不是十进制整数,请重新输入字符串的序号) else: break,try.except .else:示例2,分析功能:读取并输出文件的内容。在出现例外的情况下,执行红色的print语句后,结束程序的执行;在没有例外的情况下,执行else块的内容。,for arg in sys.argv1: try: f = open(arg, r) except IOError: print(cannot open, arg) else: print(arg, has, len(f.readlines(), lines) f.close(),8.3.3 带有多个except的try结构,功能:根据实际产生的例外,执行其中的例外程序块。,try: try_block #被监控的语句except Exception1: except_block_1 #处理异常1的语句except Exception2: except_block_2 #处理异常2的语句.,带有多个except的try:示例1,典型例子:除法。,try: x=int(input(请输入被除数: ) y=int(input(请输入除数: ) z=float(x) / yexcept ZeroDivisionError: print(除数不能为零)except TypeError: print(被除数和除数应为数值类型)except NameError: print(变量不存在)else: print(x, /, y, =, z),带有多个except的try :示例2,当有多个except块而且处理相同时,可以使用元组的形式处理。,import systry: f = open(sample.txt) s = f.readline() i = int(s.strip()except OSError as err: print(OS error: 0.format(err)except ValueError: print(Could not convert data to an integer.)except: print(Unexpected error:, sys.exc_info()0) raise,import systry: f = open(sample.txt) s = f.readline() i = int(s.strip()except (OSError, ValueError, RuntimeError, NameError): pass,8.3.4 try.except .finally结构,特点Finally中的语句总会执行;可以用于清理工作,以便释放资源。典型结构如下,try: try_block #被监控的代码except: except_block #例外处理程序块finally: finally_block #无论如何都会执行,典型例子 try: 3/0except: print(3)finally: print(5)35,try.except .finally:示例1,典型例程:文件的读取。,try: f = open(sample.txt, r) line = f.readline( ) print(line)finally: f.close(), try: f = open(sample2.txt, r) line = f.readline() print(line)finally: f.close()Traceback (most recent call last): File , line 6, in f.close()NameError: name f is not defined,完美代码?,如果文件没有创建,则在finally中会产生异常。,try.except .finally:示例2,例外产生之后,需要有相应的处理。如果没有相应的except处理块,代码的执行顺序会发生改变,直到找到相应的except处理块或者程序退出为止。, divide(2, 1)result is 2.0executing finally clause divide(2, 0)division by zero!executing finally clause divide(2, 1)executing finally clauseTraceback (most recent call last): File , line 1, in File , line 3, in divideTypeError: unsupported operand type(s) for /: str and str,def divide(x, y): try: result = x / y except ZeroDivisionError: print(division by zero!) else: print(result is, result) finally: print(executing finally clause),try.except .finally:示例3,finally代码中:返回值要慎重!如果出现return以及break,则异常被取消,不会再抛出,def demo_div(a, b): try: return a/b except: pass finally: return -1, demo_div(1, 0)-1 demo_div(1, 2)-1 demo_div(10, 2),异常处理总结,可以通过raise子句来抛出异常异常处理不会引入新的namespaceexcept子句用于捕获指定的异常,按照顺序匹配,一旦匹配后面的except字句跳过except子句可以通过 as instance来获得异常对象,但是注意except子句退出后instance不再有效可选的else子句在没有异常时执行可选的finally子句不管有没有异常都会执行如果没有捕获异常,则该异常会往try外层抛出在finally字句中有return或者break时会取消要抛出的异常!,8.4 断言与上下文处理,断言与上下文处理两种特殊的异常处理形式;形式上比通常的异常处理简单;,8.4.1 断言,断言语句的语法assert expression,reason 当判断表达式expression为真时,什么都不做;如果表达式为假,则抛出异常。即要求expression为真,用于开发程序时对特定必须满足的条件进行验证 什么时候_debug_为True? 目前的实现中,正常情况为True 当Python脚本以-O选项编译为字节码文件时,_debug_为False,assert语句不会产生任何代码,if _debug_: if not expression: raise AssertionError # raise AssertionError(reason),断言:示例1,try: assert 1 = 2 , 1 is not equal 2!except AssertionError as reason: print(%s:%s%(reason._class_._name_, reason),AssertionError:1 is not equal 2!,断言:示例2,def assert_divzero( ): a = int(input(请输入被除数:) b = int(input(请输入除数:) assert b!=0, 除数不能为0! c = a/b print(a,/,b,=,c), assert_divzero()请输入被除数:15请输入除数:0Traceback (most recent call last): File , line 1, in assert_divzero() File C:/Users/dlmao/PycharmProjects/pythonClass/exception_demo.py, line 190, in assert_divzero assert b!=0, 除数不能为0!AssertionError: 除数不能为0!,断言:示例2,例程中assert作用:调用函数使用的参数符合要求;不符合要求时:提示用户存在的问题。,def RecursiveSum(n): #precondition: n = 0 assert(n = 0) if n = 0: return 0 return RecursiveSum(n - 1) + n #postcondition: returned sum of 1 to ndef SumToN(n): if n = 0: raise ValueError(N must be greater than or equal to 0) else: return RecursiveSum(n), SumToN(10)55 SumToN(a)Traceback (most recent call last): File , line 1, in File , line 2, in SumToNTypeError: unorderable types: str() SumToN(-1)Traceback (most recent call last): File , line 1, in File , line 3, in SumToNValueError: N must be greater than or equal to 0,8.4.2上下文管理,使用with语句进行上下文管理,在with_block结束时会释放资源避免了tryfinally结构中的资源释放问题不管异常是否出现都会释放在进入时获得的资源,with context_expr as obj: with_block,obj = context_exprobj._enter_()try: with_blockfinally: obj._exit_(),用户也可以自己实现某个资源的上下文管理依赖于python语言的magic method,需要实现_enter_()和_exit_()两个方法:上下文管理协议;或者通过引用contextlib,并使用contextlib.contextmanager方式实现。,上下文管理实现:示例1 (不讲),这是一个实用Timer类,可以用来记录运行时间;可以对照上一页的内容理解本类的内容。,import timeclass Timer(object): def _init_(self): pass def _enter_(self): self.start = time.time() def _exit_(self, exception_type, exception_val, trace): print(elapsed:, time.time() - self.start)with Timer(): i for i in range(10000),elapsed: 1.7445049285888672,上下文管理实现:示例2 (不讲),代码和前面(1)中的代码功能相同;通过使用contextlib.contextmanager实现。,import contextlibimport timecontextlib.contextmanagerdef time_print(task_name): t = time.time() try: yield finally: print(task_name, took, time.time() - t, seconds.)with time_print(processes): i for i in range(10000),processes took 1.650709867477417 seconds.,with语句使用:示例,def copy_file_with(file=sample.txt): with open(file) as fr, open(file+-bk,w) as fw: for line in fr: fw.write(line),def read_file_with(file=sample.txt): with open(file) as f: for line in f: print(line,end=),def copy_file_with2(file=sample.txt): with open(file) as fr: with open(file+-bk,w) as fw: for line in fr: fw.write(line),8.5 回溯traceback最后的异常,发生异常时Python可以回溯异常,给出大量的提示;sys模块的exc_info()方法给出了最近异常的信息,该三元组分别为异常类型、异常参数以及一个包含调用栈信息的traceback对象。traceback模块的print_exc()会打印最近异常的包括调用栈在内的信息。 format_exc()与print_exc()类似,只是返回的是字符串,import sysimport tracebacktry: blockexcept: errors = sys.exc_info() print(errors) traceback.print_exc(),sys.exc_info()可以直接定位,def A(): 1/0def B(): A() def C(): B(), C()Traceback (most recent call last): File , line 1, in File , line 2, in C File , line 2, in B File , line 2, in AZeroDivisionError: division by zero, try: C()except: r = sys.exc_info() print(r)(, ZeroDivisionError(division by zero,), ),

    注意事项

    本文(Python8 异常处理结构与程序调试ppt课件.pptx)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开