目录
什么是异常
快速入门异常
常见的异常类型
常见处理方式
捕获一个指定异常
捕获多个异常
捕获所有的异常
异常的其他关键字
异常具有传递性
什么是异常
异常指的是Python程序发生的不正常事件。
有时候,异常可称为错误。
当检测到一个错误时,Python解释器就无法继续执行,反而出现了一些错误的提示,这就是异常,也就是我们常说的BUG。
快速入门异常
当程序中遇到了异常时,通常程序会出现崩溃情况。
为了不让程序崩溃,就可以使用异常来快速处理。
try:
可能发生异常的代码
except:
如果出现异常时, 执行的代码
例如,一起来完成:
(1)定义一个列表变量;
(2)获取一个远超列表索引值的元素,报错:IndexError。
print("hello 1")
print("hello 2")
j = 1/0 # 人为模拟一个异常 # ZeroDivisionError: division by zero
解决方案
print("hello 1")
print("hello 2")
try:
j = 1 / 0 # 人为模拟一个异常 # ZeroDivisionError: division by zero
except:
pass # 暂时没有想好怎么处理异常, 咱跳过
常见的异常类型
NameError、IndexError、KeyError、TypeError 、ZeroDivisionError等
# 1 使用未定义的变量
print(a) # NameError: name 'a' is not defined
# 2 字符串下标越界异常
str = "abc"
print(str[0])
print(str[100]) # IndexError: string index out of range
# 3 列表和元组 下标越界异常
list1 = [1, 2, 3]
print(list1[0])
print(list1[100]) # IndexError: list index out of range
tuple1 = (1, 2, 3)
print(tuple1[0])
print(tuple1[100]) # IndexError: tuple index out of range
# 4 使用字典中没有的 key
dict1 = {
"name" : "悟空",
"skill" : "七十二变"
}
print(dict1["name"])
print(dict1["age"]) # KeyError: 'age'
# 5 分母为0
i = 10 / 0 # ZeroDivisionError: division by zero
# 6 文件或目录 不存在
path = "./file2/hello.txt"
with open(path, "w") as f: # FileNotFoundError: [Errno 2] No such file or directory: './file2/hello.txt'
print("开始 ... ...")
# 7 类型异常
print("11" + 22) # TypeError: can only concatenate str (not "int") to str
常见处理方式
try:
可能发生异常的代码
except:
如果出现异常时, 执行的代码
print(111)
try:
j = 1 / 0
except:
pass
print(333333333)
捕获一个指定异常
try:
可能发生异常的代码
except 异常类型名:
当捕获到该异常类型时,执行的代码
print(111)
try:
j = 1 / 0
except ZeroDivisionError:
pass
print(333333333)
捕获多个异常
try:
可能发生异常的代码
except (异常类型1,类型2,...):
如果捕获到该异常类型时,执行的代码
# 方式三 捕获多个异常
print("-------------------")
try:
j = 1 / 0
str = "abc"
print(str[100])
except ZeroDivisionError:
print("除法分母不得为零!")
except IndexError:
print("下标越界异常!")
print(333333333)
# 方式四 捕获多个异常
print("---------------------")
try:
str = "abc"
print(str[100])
j = 1 / 0
except (ZeroDivisionError, IndexError):
print("报错!")
print(333333333)
# 方式四 捕获多个异常
print("-------------------")
try:
j = 1 / 0
str = "abc"
print(str[100])
except (ZeroDivisionError, IndexError) as err:
print(f"报错: {err}")
print(333333333)
捕获所有的异常
找第一个异常的问题,且Exception的首字母要大写。
try:
可能发生异常的代码
except Exception[ as 变量]:
当捕获到该异常类型时,执行的代码
# 案例1:找第一个 报错: division by zero
try:
j = 1 / 0
str = "abc"
print(str[100])
except Exception as err:
print(f"报错: {err}")
#
# print(333333333)
print("------------------------------")
# 案例二:找第一个 发生了异常信息...list index out of range
try:
data = [1, 2, 3]
print(data[100])
dicts = {}
print(dicts["name"])
except Exception as error:
print(f"发生了异常信息...{error}")
print("hello world..")
异常的其他关键字
在捕获异常过程中,有两个关键字else、finally需要注意:
else:表示如果没有异常时,要执行的代码;
finally:表示的是无论是否有异常,都要执行的代码。
当把else、finally都放入到捕获异常中,语法:
try:
可能发生异常的代码
except 异常类型:
当捕获到该异常类型时,执行的代码
else:
没有异常信息时,执行的代码
finally:
无论如何,都会执行的代码
# 1.制造异常
# 2.处理 指定异常
try:
data = [1, 2, 3]
print(data[100])
# print(data[0])
except IndexError:
print("====1====已发生异常信息!")
else: # 3.else:没有发生异常时,处理的事情
print("没有发生异常时,才会执行代码!!")
finally:# 4.finally:文件必须关闭
print("无论如何,都会执行finally!!")
异常具有传递性
(1)定义两个函数test()、func();
(2)在一个函数中产生IndexError,同时在另一个函数中调用,观察效果。
# 1.func()
def func():
print("==========A============")
try:
datas = [1,2,3]
print(datas[100])
except Exception:
# 日志、埋点? -->采集
print("发生了异常信息...") # 后台开发
print("==========B============")
# 2.test()
def test():
print("********1***********")
func()
print("********2***********")
# 3.调用test()
test()