python自学笔记8 —— 异常
8.0 概念
在运行代码时出现的ERROR,与语法错误不一样
在写代码时编译器不会报错
异常之后的代码都不能被执行
8.1 异常处理
8.1.1 try-except-finally(单个异常)
以下为基本格式
try :
# 可能出现异常的代码
except :
# 如果有异常执行的代码
finally :
# 无论是否存在异常都会被执行的代码
基本应用 :
def add() :
try: # 可能出现异常(输入为字符)
num1 = int(input("num1 = "))
num2 = int(input("num2 = "))
sum = num1 + num2
print(sum,end"")
except: # 提醒输入必须为数字
print("Should be numbers!!",end"")
finally :
print(" finally!")
add()
# 输入为 : 1 1
# 输出结果为 : 2 finally!
# 输入为 : a 1
# 输出结果为 : Should be numbers!! finally!
8.1.2 try-except-finally(多个异常)
def divide():
try:
num1 = int(input("num1 = "))
num2 = int(input("num2 = "))
num3 = num1 / num2
print(num3)
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("请输入数字")
divide()
# 输入为 : 2 3
# 输出结果为 : 0.6666666
# 输入为 : 1 0
# 输出结果为 : 除数不能为0
# 输入为 : a 1
# 输出结果为 : 请输入数字
可以观察到,异常类型是具有”大小的”,比如常见的ZeroDivisionError与ValueError都包括在Exception中
这时,由于异常判断是有顺序的,就要求我们必须把最大的Exception放到最后。
# 比如,仍是上面的那个除法运算,此时再读取一个文件,但由于文件操作可能出现未知异常,引用Exception异常
def divide():
try:
num1 = int(input("num1 = "))
num2 = int(input("num2 = "))
num3 = num1 / num2
print(num3)
with open("C:\\Users\\Administrator\\Desktop\\1\\a.txt","r") as file: # 已知无该文件
text = file.read()
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("请输入数字")
except Exception:
print("出现异常")
divide()
# 此时输出为下:
# 出现异常
# 但如果代码如下(即将except Exception放到前面):
def divide():
try:
num1 = int(input("num1 = "))
num2 = int(input("num2 = "))
num3 = num1 / num2
print(num3)
with open("C:\\Users\\Administrator\\Desktop\\1\\a.txt","r") as file: # 已知无该文件
text = file.read()
except Exception:
print("出现异常")
except ZeroDivisionError:
print("除数不能为0")
except ValueError:
print("请输入数字")
divide()
# 当输入为1,0时,会发现,报错并不是除数不能为0,而是出现异常。
# 这说明,由于Exception包括了以下两种异常,导致无法执行小范围异常的处理语句。
# 所以,当多异常处理时,应当将大异常的处理放到最后,防止小异常触发大异常的处理
8.1.3 try-except-else
try:
可能出现异常的代码
except:
发生异常,执行此处代码
else:
未发生异常,执行此处代码
8.1.4 try-finally
try:
可能出现异常的代码
finally:
无论是否出现异常,执行此处代码
8.2 触发异常
使用raise语句自己触发异常
def error(level):
if level < 1:
raise Exception("Invalid level!",level)
error(0)
# 此时编译器报错为:
# Exception: ('Invalid level!', 0)
8.3 捕获异常
def divide():
try:
num1 = int(input("num1 = "))
num2 = int(input("num2 = "))
num3 = num1 / num2
print(num3)
except Exception as err:
print("出现异常",err)
divide()
# 输入为 : 1 0
# 输出为 : 出现异常 division by zero
自己触发异常,再自己捕获异常
def error(level):
try:
if level < 5:
raise Exception("触发ERROR!",level)
except Exception as err:
print("捕获ERROR",err)
finally:
print("程序结束!")
error(1)
# 输出结果为 :
# 捕获ERROR ('触发ERROR!', 1)
# 程序结束!