异常的本质
异常:程序运行过程中出现的非正常现象。 异常处理:程序出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序的进行。 异常类:用来描述和处理异常的类,异常类定义中包含了该类异常的信息和对异常进行处理的方法。 python中一切都是对象,异常也是采用对象的方式来处理,处理的过程: 1)抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给解释器。 2)捕捉异常:当解释器得到该异常后,寻找相应的代码来处理异常
try—except结构
try—一个except结构
try :
被监控的可能引发异常的语句块
except BaseException[ as e] :
异常处理语句块
try块包含可能引发异常的代码,except块用来捕捉和处理发生的异常。BaseException所有异常根类。
try—多个except结构
捕捉可能出现的多个异常(先子类后父类的顺序),并针对性的写出异常处理的代码。为了避免遗漏可能出现的异常,可以在最后增加BaseException。
try :
被监控的、可能产生异常的语句块
except Exception1:
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
。。。
exception BaseException:
处理可能遗漏的异常语句块
try…except…else结构
执行顺序:若有try块中没有抛出异常,则执行else块;如果try块抛出异常,则执行except块,不执行else块
try…except…finally结构
try…except…finally结构中,finally块无论是否异常都会执行,用来释放try块申请的资源
常见异常汇总
return语句和异常处理问题
return语句的两种作用:结束方式运行、返回值。一般不把return语句放在异常处理结构中,而是放在方法最后
常见异常的解决
SyntaxError:语法错误 NameError:尝试访问一个没有声明的变量 ZeroDivisionError:除数为0错误(零除错误) ValueError:数值错误 TypeError:类型错误 AttributeError:访问对象的不存在的属性 IndexError:索引越界异常 KeyError:字典的关键字不存在
with上下文管理
with语法结构:with context_expr [as var]: 语句块 with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块,无论是否有异常,总能保证资源的正常释放、极大的简化工作,在文件操作、网络通信相关的场合非常常用。
traceback模块
import traceback
try :
print ( "step1" )
num= 1 / 0
except :
traceback. print_exc( )
try :
print ( "step1" )
num= 1 / 0
except :
with open ( "d:/a.txt" , "a" ) as f:
traceback. print_exc( file = f)
自定义异常类
自定义异常类:运行时异常,通常继承Exception或其子类即可。命名一般以Error、Exception为后缀 自定义异常由raise语句主动抛出
class AgeError ( Exception) :
def __init__ ( self, errorInfo) :
Exception. __init__( self)
self. errorInfo= errorInfo
def __str__ ( self) :
return self. errorInfo+ "年龄错误!"
if __name__= "__main__" :
age= input ( "输入一个年龄:" )
if age< 1 or age> 150 :
raise AgeError( age)
else :
print ( "正常的年龄" )
pycharm开发环境的调试
调试的核心是:设置断点,即程序执行到此处,暂时停止执行。 -设置断点:在行号后面单击即可增加断点;在断点上在淡季即可取消断点 -进入调试视图:单击工具栏上的按钮;右键单击编辑区,点击:debug模块名;快捷键shift+F9 调试视图左侧为浏览帧<调试器列出断点处,当前线程正在运行的方法,每个对应一个栈帧,最上面是当前断点所处的方法>,右侧为变量观察区<列出断点处所在方法相关的变量值> 调试操作区的按钮的含义: show Execution Point:显示当前所有断点 step over:单步调试,遇到函数跳过。即当前执行是一个函数,则会把函数当成整体一步执行完,不会进入函数内部。 step into:单步调试,遇到函数进入。即当前执行的是一个函数,则会进入这个函数内部。 step out:跳出函数。当单步执行到了函数内时,用step out就可以执行完函数剩下的部分,并返回上一层函数 run to cursor:一直执行到光标停止,用在循环内部时,点击一次就执行一次循环。