文章目录
try…一个except 结构
结构如下:
try:
被监控的可能引发异常的语句块
except BaseException[as e]:
异常处理的语句块
try 块包含着可能引发异常的代码,except块则用来捕捉和处理发生的异常。执行的时候,如果 try块中没有引发异常,则跳过ecept块继续执行后续代码;执行的时候,如果try块中发生了异常,则跳过try块中的后续代码,跳到相应的except块中处理异常;异常处理完后,继续执行后续代码。
print("step0")
try:
print("step1")
a=3/0#从这里开始跳过
print("step2")
except BaseException as e:
print("step3")
print(e)
print("end!!!!")
测试:
#coding=utf-8
#循环输入数字,如果不是数字则处理异常,直到输入88,则结束循环
while True:
try:
x=int(input("请输入一个数字"))
print("输入的数字:",x)
if x==88:
print("退出程序")
break
except BaseException as e:
print(e)
print("异常,输入的不是一个数字")
print("循环数字输入程序结束!")
try…多个except 结构
子类在前
结构如下:
try:
被监控的,可能引发异常的语句块
except Exception1:#子类在前
处理Exception1的语句块
except Exception2:
处理Exception2的语句块
...
exception BaseException:
处理可能遗漏的异常的语句块
try:
a=input("请输入一个被除数:")
b=input("请输入一个除数:")
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print("异常,不能除以6")
except ValueError:
print("异常,不能将字符串转化成数字")
except NameError:
print("异常,变量不存在")
except BaseException as e:
print(e)
try…except…else结构
try…except…else结构增加了”else块",如果try中没有抛出异常,则执行else块。如果try块中抛出异常,则执行except块,不执行else
try:
a = input("请输入一个被除数:")
b = input("请输入一个除数:")
c = float(a) / float(b)
except BaseException as e:
print(e)
else:
print(c)
print("程序结束!")
try…except…finally结构
try…except…finally结构,finally无论是否发生异常都会被执行:通常用来释放try块中申请的资源。
try:
a = input("请输入一个被除数:")
b = input("请输入一个除数:")
c = float(a) / float(b)
except BaseException as e:
print(e)
else:
print(c)
finally:
print("finally语句,无论异常与否,都要执行")
print("程序结束!")
常见异常解决
return语句和异常处理问题
由于return有两种作用:结束方法运行、返回值。我们一般不把return放到异常处理结构中,而是放到方法最后。
常见异常的解决
- SyntaxError 语法错误
- NameError 尝试访问一个没有申明的变量
- ZeroDivisionError 除数为0错误
- ValueError 数值错误
- TypeError 类型错误
- AttributeError 访问对象不存在的属性
- IndexError 索引越界异常
- KeyError 字典的关键字不存在
with上下文管理
finally块由于是否发生异常都会执行,通常我们放释放资源的代码。其实,我们可以通过with 上下文管理,更方便的实现释放资源的操作。|
语法结构:
with context_expr[as var]:
语句块
with 上下文管理可以自动管理资源,在with 代码块执行完毕后自动还原进入该代码之前的现场或上下文。不论何种原因跳出 with 块,不论是否有异常,总能保证资源正常释放。极大的简化了工作,在文件操作!网络通信相关的场合非常常用。
trackback模块
使用trackback模块打印异常信息
import traceback
try:
print("step1")
num=2/0
except:
traceback.print_exc()
#######0####将异常信息输出到指定文件#################
try:
print("step1")
num=2/0
except:
with open("d:/a.txt","a") as f:
traceback.print_exc(file=f)
自定义异常类
程序开发中,有时候我们也需要自己定义异常类。自定义异常类一般都是运行时异常,通常继承Exception或其子类即可。命名一般以Error、Exception为后缀。
自定义异常由raise 语句主动抛出。
class AgeError(Exception):#继承Exception
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo=errorInfo
def __str__(self):
return "年龄错误"
###########测试代码###############
if __name__=="__main__":#如果是True,则模块是作为独立文件运行,可以执行测试代码
age=int(input("输入一个年龄"))
if age<1 or age>150:
raise AgeError(age)
else:
print("正常的年龄:",age)