1、 错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具第十章 错误及异常处理参考书目Python 程序设计目录 错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具这里说明图片内容 错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具目录这里说明图片内容 错误与异常1 两种类型的错误 不管那种错误,只要被Python检测到,程序都会发生异常1.语法错误
2、语法错误是指软件的编写不符合Python语言的语法规定,导致无法被解释器解释或编译器编译。2逻辑错误程序运行以后出现的错误就是逻辑错误,逻辑错误可能是由于外界条件引起的(比如网络断开、文件格式损坏、输入字符串格式不正确等),也可能是程序本身设计不严谨导致的,比如0作为除法。错误与异常2 什么是异常当Python检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就是出现了异常。异常分为两个阶段:引起异常发生的错误检测并进行处理的阶段第一个阶段第二个阶段错误与异常2 什么是异常异常的5种用途:错误处理事件通知特殊情况处理终止行为非常规控制流程错误与异常2 什么是异常在Python中常
3、使用异常对象来表示不同的异常,并已经为常见的异常建立了异常类。异常类名描 述BaseException所有异常的基类Exception常规错误的基类NameError尝试访问一个没有申明的变量IndentationError缩进错误ZeroDivisionError除数为0SyntaxError语法错误IndexError索引超出序列范围KeyError映射不存在的(字典)键IOError输入输出错误(比如你要读的文件不存在)AttributeError尝试访问未知的对象属性ValueError传给函数的参数类型不正确TypeError将变量类型不同相符的值赋给变量时EOFError发现一个不
4、期望的文件尾错误与异常3 常见的错误与异常1.缺少冒号引起的错误。2.将比较运算符“=”与赋值运算符“=”混淆。3.代码结构的缩进错误。4.修改元组和字符串值时报错。5.连接字符串和非字符串。6.在字符串首尾忘记加引号。错误与异常3 常见的错误与异常7.变量或函数名拼写错误。8.使用关键字作为变量名。9.引用超过列表最大值索引值。10.变量没有初始化值时,参与运算引起错误。11.误使用自增和自减运算符。12.在定义类时,忘记为方法的第一个参数添加self参数。错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具目
5、录这里说明图片内容 捕获和处理异常当程序出现异常时,Python默认的异常处理行为将开始工作,它会停止程序并打印出错误消息。但这往往并不是我们想要的。例如,服务器程序一般需要在内部错误发生时依然保持工作。如果不希望使用默认的异常处理行为,就需要把调用包装在try语句中,自行捕捉异常。异常由四个相关语句进行处理:tryexceptelsefinally检测异常捕获异常捕获和处理异常1 try.except.语句try:可能会出错的代码except 错误类型:出错后的处理语句try-except语句定义了监控异常的一段代码,并提供了处理异常的机制。捕获和处理异常2 tryexceptelse语句如
6、果try范围内捕获了异常,就执行except块;如果try范围内没有捕获异常,就执行else块。捕获和处理异常3 带有多个except的try语句try:#语句块except 异常名称1:#异常处理代码1except异常名称2:#异常处理代码 处理多个异常的try-except语句格式如下:捕获和处理异常4 捕获所有异常BaseException是所有内建异常的基类,通过它可以捕获所有类型的异常,Keyboardlnterrupt,SystemExit和Exception是从它直接派生出来的子类。程序需要捕获所有异常时,可以使用BaseException。try:x=float(input(请
7、输入被除数:)y=float(input(请输入除数:)z=x/yexcept BaseException as e:print(e)else:print(z)捕获和处理异常5 finally子句try:可能会出错的语句finally:无论是否出错都会执行的语句Finally子句与try语句联合使用,表示无论try语句是否出错都会执行语句。在程序中,无论是否捕捉到异常,都必须要执行某件事情,例如关闭文件、释放锁等,这时可以提供finally语句处理。通常情况下,finally用于释放资源。捕获和处理异常5 finally子句try:可能会出现异常的语句块Except A:异常发生后的处理Exc
8、ept B:异常发生后的处理except:其他异常发生后的处理else:异常未发生后的执行语句finally:无论异常是否发生都会执行的语句。总语法结构:所出现的顺序必须是try-except X-except-else-finally 错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具目录这里说明图片内容 处理异常的特殊方法1 raise语句抛出异常在Python中,raise语句用于抛出特定的异常,其语法格式如下:如果捕获到的异常在本级无法处理,或者不应该由本级处理,也可以将异常抛出,交给上一级代码处理等方
9、式。raise Exception,args,tracebackException是异常的类型(例如,NameError)参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是None。最后一个参数是可选的(在实践中很少使用),是跟踪异常对象。处理异常的特殊方法1 raise语句抛出异常Python 3.0(而不是2.6)也允许raise语句拥有一个可选的from子句。raise exception from otherexception使用raise.from可以在异常中抛出另外的异常。try:numexcept Exception as exception:raise IndexE
10、rror(下标超出范围)from exceptiontry里面只定义了变量num,会引发NameError异常。except子句使用raise.from 抛出NameError异常后再抛出“下标越界”的异常。2 assert语句判定用户定义的约束条件Assert断言语句用于判断一个表达式是否为真,如果表达式为True,则不作任何操作,如果为False则会引发AssertionError异常。assert 逻辑表达式,data if not 逻辑表达式:raise AssertionError(data)assert后面紧跟一个逻辑表达式,相当于条件。Data通常是一个字符串,当条件为false
11、时作为异常的描述信息。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!处理异常的特殊方法3 withas语句With语句适用于对资源进行访问的场合,无论资源使用过程是否发生异常,都会执行必要的释放资源的操作,比如文件使用后的自动关闭、线程中锁的自动获取和释放等。with 上下文表达式 as 资源对象:对对象的操作with open(c:temp.txt)as f:for
12、 line in f:print(line)程序运行结果如下:人生苦短,我只用Python!处理异常的特殊方法4 自定义异常-创建一个继承Exception类的子类,就是自定义异常类。-当遇到自己设定的错误时,使用raise语句抛出自定义的异常。【例】创建一个类,基类为BaseException,用于在异常触发时输出更多的信息的自定义异常处理示例。class Networkerror(BaseException):def _init_(self,msg):self.msg=msg def _str_(self):return self.msgtry:raise Networkerror(类型错
13、误)except Networkerror as e:print(e)错误与异常错误与异常 捕获和处理异常捕获和处理异常 处理异常的特殊方法处理异常的特殊方法 PyCharm中使用中使用debug工具工具目录PyCharm中使用debug工具5 PyCharm中使用debug工具断点调试是在开发过程中常用的功能,能清楚看到代码运行的过程,有利于代码问题跟踪。pycharm调试程序的过程如下:1.打断点:打断点:左键点击行号右边出现一个红色圆点标志为断点,再次点击取消断点PyCharm中使用debug工具5 PyCharm中使用debug工具2.右键点击编辑区,点击右键点击编辑区,点击Debug
14、按钮;或在工具栏选择运行的文件,点按钮;或在工具栏选择运行的文件,点Debug图标按钮图标按钮PyCharm中使用debug工具5 PyCharm中使用debug工具3.显示出显示出Debug控制台。控制台。控制台有两个显示的面板:Debugger和console。Debugger用于显示变量和变量的细节,Console用于输出内容。PyCharm中使用debug工具5 PyCharm中使用debug工具4.点击点击Step Over按钮开始单步调试,每点击一次,跳一步。并在解释区按钮开始单步调试,每点击一次,跳一步。并在解释区显示内容。显示内容。5.点击完最后一步,解释区也清空。整个过程能清
15、楚的看到代码的运行位点击完最后一步,解释区也清空。整个过程能清楚的看到代码的运行位置。置。PyCharm中使用debug工具5 PyCharm中使用debug工具6.接下来,针对接下来,针对console界面的调试。重新运行调试程序,点击界面的调试。重新运行调试程序,点击console,更换至输出数据面板。点击更换至输出数据面板。点击Step Over步步执行代码。步步执行代码。7.最后一步,将显示信息:最后一步,将显示信息:Process finished with exit code 0。整个调试过。整个调试过程结束。程结束。本章小结Python异常是一种高级控制流设备。它们可能由Python引发,或者由你自己的程序引发。本章详细地介绍了异常的处理,探索Python中有关异常的语句:try是捕捉,raise是触发,assert是条件式引发,而with是把代码块包装在环境管理器中。思考与练习1简述try语句的用途。2try语句的两个常见变体是什么?3raise语句有什么用途?4try-except和try-finally有什么不同?