目录
case1:
# 异常:没有语法错误,运行时候才可能会出现的错
# 出现异常后,其后面的代码不会被执行
# 异常处理
'''
格式:
try:
可能出现异常的代码
except:
出现异常执行的代码
finally: (可有可无)
有无异常都会执行的代码
'''
# 除法运算
def chufa1():
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
try:
res = a / b
print('除法运算的结果为:',res)
except:
print('输入必须为数字且第二个数字不能为0!!!')
finally:
print('除法运算结束!')
# chufa1()
case2:多个except
# 有特定异常类型的异常处理机制 多个except
'''
格式:
try:
可能出现异常的代码
except 异常的类型1:
出现异常1执行的代码
except 异常的类型2:
出现异常2执行的代码
finally: (可有可无)
有无异常都会执行的代码
'''
'''
异常类型有:ZeroDivisionError,ValueError,NameError,Exception等,
各个异常类型是有优先级的,Exception高于ZeroDivisionError,ValueError等
在放置各个异常类型的时候,要先放置子异常类型,再放父异常类型
'''
def chufa2():
try:
# 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
res = a / b
print('除法运算的结果为:',res)
except ZeroDivisionError:
print('输入的第二个数字不能为0!!!')
except ValueError:
print('必须输入数字!!!')
finally:
print('除法运算结束!')
# chufa2()
case3: 获取确切的错误原因(Exception)
# 当出现错误的时候,获取确切的错误原因
'''
格式:
try:
可能出现异常的代码
except 异常的类型1:
出现异常1执行的代码
except 异常的类型2:
出现异常2执行的代码
except Exception as err:
print(err) # err的内容就是错误的类型
finally: (可有可无)
有无异常都会执行的代码
'''
def func():
try:
# 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
res = a / b
print('除法运算的结果为:',res)
# 目前无该文件
with open(r'D:\haha.txt','r') as rstream:
print(rstream.read())
except ZeroDivisionError:
print('输入的第二个数字不能为0!!!')
except ValueError:
print('必须输入数字!!!')
except Exception as err:
# 不是以上两种错误时候,返回其具体错误类型
print('出错了,错误类型是:',err)
finally:
print('除法运算结束!')
func()
# 请输入第一个数字:1
# 请输入第二个数字:2
# 除法运算的结果为: 0.5
# 出错了,错误类型是: [Errno 2] No such file or directory: 'D:\\haha.txt'
# 除法运算结束!
try......else...
# try... else
'''
try:
可能出现异常的代码
except 类型1:
pass
else:
如果try中没有发生异常则进入的代码
PS: 如果使用else,则在try中不能出现return
'''
def chufa():
try:
# 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
res = a / b
print('除法运算的结果为:',res)
except ZeroDivisionError:
print('输入的第二个数字不能为0!!!')
except ValueError:
print('必须输入数字!!!')
else:
# 出现异常的时候就不会执行
print('除法运算顺利结束!')
# chufa()
# try中含有return时候else就不起作用
def chufa_rerurn():
try:
# 输入也是可能会出现异常的地方,如果输入非数字,会报异常,所以放在try里面
a = int(input('请输入第一个数字:'))
b = int(input('请输入第二个数字:'))
res = a / b
print('除法运算的结果为:',res)
return res
except ZeroDivisionError:
print('输入的第二个数字不能为0!!!')
except ValueError:
print('必须输入数字!!!')
else:
# 出现异常的时候就不会执行
print('除法运算顺利结束!')
# chufa_rerurn()
try......finally...
'''
try ...finally...的使用场景:
1.文件流的关闭
2.数据库操作:如数据库关闭
'''
def func():
stream = None # 必须先定义一下,否则finally里面无法使用
try:
stream = open(r'D:\none.txt','r')
container = stream.read()
print(container)
except Exception as err:
print(err)
finally:
print('-----finally----')
if stream:
stream.close()
func()
# [Errno 2] No such file or directory: 'D:\\none.txt'
# -----finally----
含有return的时候,
def func():
stream = None # 必须先定义一下,否则finally里面无法使用
try:
stream = open(r'D:\none.txt','r')
container = stream.read()
print(container)
return 1
except Exception as err:
print(err)
return 2
finally:
print('-----finally----')
if stream:
stream.close()
return 3
func()
# 无异常的时候,try里面的return 1不会立刻返回,
# 到了finally之后, rerun 3 会覆盖1 而返回;
# 有异常的时候,except里面的return 2不会立刻返回,
# 到了finally之后, rerun 3 会覆盖2而返回
手动抛出异常:raise
# 异常抛出:raise
# 自定义异常
def regis():
uname = input('用户名:')
if len(uname) < 6:
raise Exception('用户名长度需要至少6位!!!')
else:
print('您输入的用户名为:', uname)
# 调用1:
# regis()
# 用户名:wqqs
# Traceback (most recent call last):
# File "D:/Python/code/functionstudy/yichang.py", line 223, in <module>
# regis()
# File "D:/Python/code/functionstudy/yichang.py", line 219, in regis
# raise Exception('用户名长度需要至少6位!!!')
# Exception: 用户名长度需要至少6位!!!
# 调用2:
try:
regis()
except Exception as err:
#当try里面raise异常的时候,Exception就会接住这个异常
print(err)
print('注册失败')
else:
print('注册成功')
ps: 在研发过程中,一般是让系统来抛异常,只有特定需要的时候才会手动抛出异常。