异常是什么?
软件程序在运行过程中,非常可能遇到刚刚提到的这些问题,我们称之为异常,英文是: Exception ,意思是例外。遇到这些例外情况, 或者叫异常,我们怎么让写的程序做出合理的理,安全的退出, 而不至于程序崩溃呢?
工作中,程序遇到的情况不可能完美。比如:程序要打开某个 文件,这个文件可能不存在或者文件格式不对;程序在运行 着,但是内存或硬盘可能满了等等。
伪代码说明异常机制
如果我们要拷贝一个文件,在没有异常机制的情况下我们需要考虑各种异常情况伪代码如下:// d:/a.txt复制到e:/a.txt(伪代码)
if ("d:/a.txt"这个文件存在){
if(e盘的空间大于a.txt文件的长度){
if(文件复制一半IO流断掉){
停止copy,输出:io流有问题!
}else{
copyFile("d:/a.txt","e:/a.txt");
}
}else{
System.out.println("e盘空间不够存放a.txt文件!");
}
}else{
System.out.println("a.txt不存在!");
}
这种方式,有两个坏处:
- 逻辑代码和错误处理代码放一起!
- 程序员本身需要考虑的例外情况较复杂,对程序员本身要求较高!
如上情况,如果是用Python的异常机制来处理,对比如下:
python 中,引进了很多用来描述和处理异常的类,称为异常类。异 常类定义中包含了该类异常的信息和对异常进行处理的方法。下面 较为完整的展示了python中内建异常类的继承层次: 如测试0是否被整除:异常机制本质
当程序出现异常,程序安全的退出、处理完后继续执行的机制
#测试简单的0不能做除数异常
a = 3/0
报错,异常了,显示0不能被整除
Traceback (most recent call last):
File "...mypro_exception/my01.py", line 1,
in <module>
a = 3/0
ZeroDivisionError: division by zero
Process finished with exit code 1
使用try...except来定位异常:
try:
a = 3/0
except ZeroDivisionError as e:
print(e)
# division by zero
异常解决的关键:定位
当发生异常时,解释器会报相关的错误信息,并会在控制台打印出 相关错误信息。我们只需按照从上到下的顺序即可追溯 (Trackback)错误发生的过程,最终定位引起错误的那一行代码。 【示例】追溯异常发生的过程def a():
print("run in a() start! ")
num = 1 / 0
print("run in a() end! ")
def b():
print("run in b() start!")
a()
print("run in b() end! ")
def c(): print("run in c() start!")
b()
print("run in c() end! ")
print("step1")
c()
print("step2")
try...except结构
try...except 是最常见的异常处理结构。结构如下:try : 被监控的可能引发异常的语句块 except BaseException [ as e ]: 异常处理语句块try 块包含着可能引发异常的代码, except 块则用来捕捉和处理发生的异常。 执行的时候,如果 try 块中没有引发异常,则跳过 ecept 块继续执行后续代码; 执行的时候,如果 try 块中发生了异常,则跳过 try 块中的后续代码,跳到相应的 except 块中处理异常;异常处理完后,继续执行后续代码。 【示例】遇到异常的执行顺序
#测试简单的0不能做除数异常
try:
print("step1")
a = 3/0
print("step2")
except BaseException as e:
print("step3")
print(e)
print("step4")
除数为
0
,遇到异常输出结果:
step1 step3 division by zero step4
try...except...else结构
try...except...else 结构增加了 else块 。如果 try 块中没有抛出异常,则执行 else 块。 如果 try 块中抛出异常,则执行 except 块,不执行 else 块。 try...except...finally 结构 try...except...finally 结构中, finally 块无论是否发生异常都会被执行; 通常用来释放 try 块中申请的资源。常见异常汇总
自定义异常类
程序开发中,有时候我们也需要自己定义异常类。自定义异常类一 般都是运行时异常,通常继承 Exception 或其子类即可。命名一般以 Error 、 Exception 为后缀。 自定义异常由 raise 语句主动抛出。标签:try,...,处理,except,Pyhton,print,txt,异常 From: https://blog.csdn.net/m0_73596070/article/details/139484516