# 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行,也是程序运行过程中,产生的各种各样的错误
# 有的错误是程序编写有问题造成的,有的错误是用户非常规输入造成的
# 还有一些错误是程序运行过程中偶发的,如网络请求过程中断网了、磁盘满了等等
# 上面出现的这些所有的错误导致程序没有按照预期执行,这些原因被统称为异常
# 一般情况下,在Python无法正常处理程序时就会发生一个异常
# 异常处理
# Python中捕捉异常使用try/except语句
# 语法
# try:
# 代码块
# except:
# 发生异常后执行的代码块
# try/except更多写法
# except后跟异常名称Exception1,Exception2,表示只捕获这两种异常
# except后未跟异常名称,表示捕获所有的异常
# as e1表示给想要捕获的异常Exception2起别名
# try:
# 代码块
# except Exception1:
# 上方异常处理
# except Exception2 as e1:
# e1异常处理
# 使用一个except捕获多个异常
# try:
# 代码块
# except(Exception1,Exception2,.....ExceptionN):
# 异常处理
# try-else语句 else后跟没有异常发生执行的代码块
# try:
# 代码块
# except:
# 异常处理代码块
# else:
# 代码块
# try-finally语句 无论是否发生异常都将执行finally后的代码
# try:
# 代码块
# except:
# 异常处理代码块
# finally:
# 代码块
# 实例
def first(a,b):
c = a / b
return c
# 传入正常值
# result = first(4,2)
# print(result)
# 传入错误值,b 分母不能为0
# result =first (4,0)
# print(result)
# 使用异常处理机制,将可能出现异常的代码放入到try中
def second(a1,b1):
try:
c1 = a1 / b1
except:
return "b1不能为0"
return c1
# 传入错误
result1 = second(4,0)
print(result1)
# 只捕获想要的异常ZeroDivisionError
def third(a2,b2):
try:
c2 = a2 / b2
except ZeroDivisionError:
return "代码异常"
return c2
# 传入错误分母
result1 = third(4,0)
print(result1)
# 捕获多个想要的异常
def fourth(a3,b3):
try:
name = a3.name
c3 = a3 / b3
except ZeroDivisionError:
return "b3不能为0"
except AttributeError:
return "b3无name属性"
return c3
# 传入错误,a3无name属性
result1 = fourth(4,0)
print(result1)
# 输出捕获的异常, as给异常起别名
def fifth(a4,b4):
try:
name = b4.name
c4 = a4 / b4
except ZeroDivisionError:
return "代码异常"
except AttributeError as ab:
print(ab)
return "b3无name属性"
return c4
# 传入错误
result1 = fifth(4,0)
print(result1)
# else,try中代码无异常则执行else后的语句
def sixth(a5,b5):
try:
c5 = a5 / b5
except ZeroDivisionError:
return "代码异常"
else:
print('未出现异常')
return c5
# 传入错误
result1 = sixth(4,3)
print(result1)
# finally无论是否出现异常,都执行finally后的语句,通常用来释放资源
# 正常实例
d = 12
e = 3
try:
f = d/e
except:
print("异常产生")
finally:
print("总会执行")
# 异常实例
d1 = 12
e1 = 0
try:
f1 = d1/e1
except:
print('异常产生')
finally:
print('一直执行')
# 主动抛出异常
# 异常崩溃的原因:代码不够健壮
# 异常产生的原因:代码抛出来的
# 抛出异常使用函数:raise,assert两种
# raise [Exception [, args [, traceback]]],语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
# 最后一个参数traceback是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
# def seventh(x):
# assert x != 0, "a不能为0"
# print(x)
# seventh(0)
# def eighth(n):
# if n == 0:
# raise AssertionError("n不能为0")
# print(n)
#
# eighth(0)