1 异常捕获常见格式:
'''
try:
可能会出现异常的代码
except:
出现了异常,执行的代码
finally:
无论有没有异常,都会执行的代码
eg1:
try:
有可能会出现多种异常---》则需要多个except + 异常类型
except 类型1:
print(......)
except 类型2:
print(.......)
except Exception:--->必须放在最后
pass
eg2:
try:
有可能会出现多种异常---》则需要多个except + 异常类型
except 类型1:
print(......)
except 类型2:
print(.......)
except Exception as err:
print(err)--->err的内容就是错误的原因
eg3:
try:
有可能异常代码
except 类型1:
else:
如果try中没有发生异常,则进入该代码块
注意:如果使用else,则在try中不能出现return
eg4:
文件操作 stream = open(..) stream.read()/ stream.close()
【1】文件读取错误--》下面代码不会执行,可能文件没有关闭----》任然要关闭内存
【2】 数据库的操作
try:
可能会出现异常的代码
except:
出现了异常,执行的代码
finally:
无论有没有异常,都会执行的代码
'''
2、简单异常报错
# (1) 异常:程序运行时报出的错误: 一般为XXXError,程序异常后面代码都不会运行
'''
def chu(a,b):
return a / b
x = chu(2,4)
print('x--------------->',x)
'''
# (2) 异常处理
'''
try:
可能会出现异常的代码
except:
出现了异常,执行的代码
finally:
无论有没有异常,都会执行的代码
eg1:
try:
有可能会出现多种异常---》则需要多个except + 异常类型
except 类型1:
print(......)
except 类型2:
print(.......)
'''
# (3) 实列
# 可能会遇到输入为字母,或者其他的,导致程序崩溃
'''
def func():
n1 = int(input('Input first number:'))
n2 = int(input('Input second number:'))
sum = n1 + n2
print('sum: ',sum)
func()
'''
# (4)解决办法
'''
def func():
try:
n1 = int(input('Input first number:'))
n2 = int(input('Input second number:'))
sum = n1 + n2
print('sum: ',sum)
except:
pass
func()
print('--------------->')
'''
'''
结果所示:
Input first number:s2
--------------->
'''
# (5)
'''
def func():
try:
n1 = int(input('Input first number:'))
n2 = int(input('Input second number:'))
sum = n1 + n2
print('sum: ',sum)
except:
print('必须输入数字!!!')
func()
print('--------------->')
'''
# (6)当代码比较长,且多个可能会出现异常的代码块时,要定位清晰
def func():
try:
n1 = int(input('输入第一个数字:')) # 这里可能会出错,因为输入字母并不能转换成整型
n2 = int(input('输入第二个数字:'))
oper = input('输入运算符号(+ - * /):')
result = 0
if oper =='+':
result = n1+n2
elif oper =='-':
result = n1-n2
elif oper =='*':
result = n1*n2
elif oper=='/':
result = n1/n2 # 这里也有可能会出错,除数不能为0
else:
print('符号输入有误!')
print('结果是:',result)
except ZeroDivisionError: # 这个except只接受这个类型的错误,ValueError不匹配的类型
print('除数不能为0!!')
except ValueError:
print('输入的必须是数字')
# 如果还有异常没有被预知到
except Exception:
pass
func()
print('--------------->')
3、异常类型
def func():
try:
n1 = int(input('输入第一个数字:')) # 这里可能会出错,因为输入字母并不能转换成整型
n2 = int(input('输入第二个数字:'))
oper = input('输入运算符号(+ - * /):')
result = 0
if oper == '+':
result = n1 + n2
elif oper == '-':
result = n1 - n2
elif oper == '*':
result = n1 * n2
elif oper == '/':
result = n1 / n2 # 这里也有可能会出错,除数不能为0
else:
print('符号输入有误!')
print('结果是:', result)
# 这里进行文件写操作
# with open(r'c:\p1\aa.txt','w') as wstream:
# wstream.write("本次的运算结果是:{}".format(result))
list1 = []
list1.pop()
with open(r'C:\p1\aa.txt','r') as wstream:
print(wstream.read())
except ZeroDivisionError: # 这个except只接受这个类型的错误,ValueError不匹配的类型
print('除数不能为0!!')
except ValueError:
print('输入的必须是数字')
# except FileNotFoundError:
# pass
# except NameError:
# pass
# 【1】如果还有异常没有被预知到--》异常是按顺序执行的,把这个放最上面
# 会出现无论什么异常都会报“出错了”
# 【2】如果5个异常,上面匹配两个,还有3个都被概括为出错了---》现在需要找出每一个出错的原因
except Exception as err:
print('出错了!!',err)
# 出错了!! [Errno 2] No such file or directory: 'C:\\p1\\aa.txt'
# 出错了!! pop from empty list
func()
print('--------------->')
'''
def func():
try:
n1 = int(input('输入数字:'))
print(n1)
# return 1
except ValueError:
print('必须是数字。。。')
return 2
else:
print('输入数字完毕!') # 没有异常才会执行的代码块
func()
print('--------->')
'''
'''
输入数字:2
2
输入数字完毕!
--------->
'''
def func():
stream = None
try:
stream = open(r'C:\p1\aa.txt')
container = stream.read()
print(container)
return 1
except Exception as err:
print(err)
return 2
finally:
print('------finally------>')
if stream:
stream.close()
return 3
# stream 在try块中声明,在finally引用就会有,无法访问--》在前面加一个
x = func()
print(x)
# 返回值为3--》把1覆盖,但是没有finally return的情况下,会返回1
5、手动抛出异常
# 抛出异常
# 1、注册用户名必须6位,小于6位则抛出异常
# raise 主动抛出异常
def register():
username = input('输入用户名: ')
if len(username)<6:
raise Exception('用户长度必须6位以上')
else:
print('输入的用户名是:',username)
# 2、有异常,需要处理
try:
register() # 这是封装好的
except Exception as err: # 上面运行有异常,except会抓住异常
print(err)
print('注册失败!')
else:
print('注册成功!')
'''
输入用户名: admin
Exception: 用户长度必须6位以上
在开发过程中,只要有一个问题不符合需求,希望主动抛出一个异常--》以这种形式报出异常
'''
'''
输入用户名: admin
用户长度必须6位以上
注册失败!
'''
'''
(1) with 不是用来取代try..except..finally结构的,只是作为补充,方便我们在
文件管理,网络通信时的开发
(2)with结构可以自动启动上下文管理资源,在with代码执行完毕后自动还原进入,该代码之前的现场或上下文
不论何种原因跳出with块,无论是否异常,总是能保证资源的正常释放----》在文件操作,网络通信常用
'''
'''
# (1)== (2)
try:
f = open("d:/addd.txt","r")
container = f.readline()
print(container)
except:
print("文件未找到!")
finally:
print("run in finally!")
try:
f.close()
except BaseException as e:
print(e)
# (2)
with open("d:/addd.txt","r") as f:
container = f.readline()
print(container)
print("run in finally!!")
'''
# (3) trackback模块
# (3.1)使用trackback模块打印异常信息---->更加方便(更加全面)
# import traceback
#
# try:
# print("step1")
# num = 1/0
# except:
# traceback.print_exc() # 打印执行情况
'''
Traceback (most recent call last):
File "D:/SOFT_PACKAGE/PY/Python/1_Exception/Exception5.py", line 39, in <module>
num = 1/0
step1
ZeroDivisionError: division by zero
'''
# (3.2)把异常信息打印到文件中
import traceback
try:
print("step1")
num = 1/0
except:
with open(r'C:\p1\a3.txt','w') as f:
traceback.print_exc( file=f ) # 打印执行情况