01_异常的本质_调试核心理念
1.异常导引
2.异常机制本质
a.异常是指程序运行过程中出现的非正常现象,例如用户输入错误,除数为0,需要处理的文件不存在,数组下标越界等
b.异常处理:指程序在出现问题时依然可以正确的执行剩余的程序,而不会因为异常而终止程序执行
c.Python中引进了很多用来描述和处理异常的类,称为异常类
d.Python中一切都是对象,异常也采用对象的方式来处理。处理过程:
1.抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并 把异常对象提交给解释器
2.捕获异常:解释器得到该异常后,寻找相应的代码来处理该异常
a=3/0
#以下为异常
C:\Users\小鹿\PycharmProjects\untitled1\venv\Scripts\python.exe C:/Users/小鹿/PycharmProjects/untitled1/Python5.py
Traceback(追溯的意思) (most recent call last)【最后一次调用】:
File "C:/Users/小鹿/PycharmProjects/untitled1/Python5.py", line 1, in <module>
a=3/0
ZeroDivisionError(零的除法异常): division by zero
02_try_except基本结构
try:
被监控的可能引发异常的语句块
except BaseException[as e]:
异常处理语句块
<注>1.try块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常,执行的时候,如果try块中没有发生异常,则跳过except块继续执行后续代码;执行的时候,如果try块发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常 ;异常处理完后,继续执行后续代码
2.BaseException是所有异常的根类
try:
print("a")
#a=1/0
a=9/3#对比没有异常
print("b")#因为上一条语句出现异常,所以本条语句不执行
except BaseException as f:#把异常对象赋值给f
print("c")
print(f)
print(type(f))#查看f的类型
#处理完异常以后,程序继续执行
print("d")
#示例循环输入数字,如果不是数字则处理异常
while True:
try:
print("请输入一个数字:")
x=int(input())
if x==5:
print("x=5")
break
except BaseException as f:
print(f)
print("处理异常")
print("程序结束!")
##################控制台:
请输入一个数字:
2
请输入一个数字:
热
invalid literal for int() with base 10: '热'
处理异常
请输入一个数字:
5
x=5
程序结束!
03_try_多个except结构
捕获可能出现的多个异常,按照先子类后父类的顺序,并且针对性的写出异常处理代码,为避免遗漏可能出现的异常,可以在最后增加Baseexception 。结构如下:
try:
被监控的,可能引发异常的语句块
except Exception1:
处理Exception1的语句块
except Exception1:
处理Exception1的语句块
...
except Baseexception:
处理可能遗漏的异常的语句块
#测试try,多个except
try:
a=input("请输入一个被除数:")
b=input("请输入一个除数:")
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("不能将字符串转化为数字")
except BaseException as f:
print(f)
print("其他异常!")
04_else结构
try...except...else结构增加了“else”块,如果try块中没有抛出异常,则执行else块。如果try块抛出异常,则执行except块,不执行else块
#测试try,多个except
try:
a=input("请输入一个被除数:")
b=input("请输入一个除数:")
c=float(a)/float(b)
except BaseException as f:
print(f)
print("异常!")
else:
print("没有异常!除的结果是:",c)
print("程序结束")
05_finally结构
try...except...finally结构中,finally块无论是否发生异常都会被执行,通常用来释放try块中申请的资源
#测试try...except...else...finally
try:
a=input("请输入一个被除数:")
b=input("请输入一个除数:")
c=float(a)/float(b)
except BaseException as f:
print(f)
print("异常!")
else:
print("没有异常!除的结果是:",c)
finally:
print("finally")
print("程序结束")
#典型处理io流时,使用finally
try:
f = open("19.txt", "r")
a = f.readline()
print(a)
except:
print("文件未找到!")
finally:
print("finally--关闭资源")
try:
f.close()
except BaseException as e:
print(e)
print("程序结束!")
06_常见异常汇总和说明
<注>return语句和异常处理问题:由于return有两种作用,结束方法运行、返回值,我们一般不把return放到异常处理结构中,而是放到方法最后
常见异常:
1.SyntaxError:语法错误
2.NameError:尝试访问一个没有申明的的变量
3.ZeroDivisionError:除数为0错误
4.ValueError:数值错误
5.TypeError:类型错误
6.AttributeError:访问对象的不存在属性
7.IndexError:索引越界异常
8.KeyError:字典的关键字不存在
07_with上下文管理
finally块由于是否发生异常都会执行操作,通常我们放释放资源的代码。其实我们可以通过with上下文管理更方便的实现释放资源的操作
with上下文管理的语法结构如下:
with context_expr[as var]:
语句块
<注>with上下文管理可以自动管理资源,在with代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出with块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作、网络通信相关的场合非常常用
#with不是用来取代try的,知识作为补充、方便我们文件管理、网络通信时的开发
with open("15.txt","r")as f:
a=f.readline()
print(a)
print("程序执行结束!")
08_trackback模块的使用_异常写入日志文件
#测试traceback模块的使用
import traceback
#try:
# print("lal ")
#num=1/0
#except:
# traceback.print_exc()
############################将异常信息输出到文件
try:
print("lal ")
num=1/0
except:
with open("15.txt","a")as f:
traceback.print_exc(file=f)
09_自定义异常类_raise抛出异常
自定义异常类一般都是运行时异常,通常继承Exception或其子类即可,命名一般以Error,Exception为后缀
自定义异常由raise语句主动抛出
#自定义异常类
class AgeError(Exception):#继承
def __init__(self,errorInfo):#重写构造器并添加局部变量,来描述错误信息
Exception.__init__(self)#调用父类构造器
self.errorInfo=errorInfo#添加属性
def __str__(self):
return str(self.errorInfo)+"年龄错误!"
###测试代码
if __name__=="__main__":#如果为True,则模块是作为独立文件运行,可以执行测试代码
age=int(input("输入年龄:"))
if age<1 or age>150:
raise AgeError(age)#抛出异常
else:
print("正常年龄:",age)
10_pycharm的调试模式
1.进行调试的核心:设置断点。程序执行到断点时,暂时挂起,停止执行。在断点处可以详细观察程序运行情况,方便做出进一步的判断
2.进入调试视图,三种方法
#测试调试,断点
def aa():
print("aaaa")
print("bbbb")
num1=2
num2=num1*4
num3=num2*5
print("cccc")
print("结束!")
if __name__=="__main__":
print("main:bbbb")
aa()
print("main:cccc")
print("main:结束!")
#对以上代码设置断点进行debug
3.测试run to cursor运行到光标处