一、else 块与 finally 块
1、基本介绍
- else 块表示如果没有异常要执行的代码
python
try:
【可能发生异常的代码】
except:
【捕获异常后执行的代码】
else:
【如果没有异常要执行的代码】
- finally 块表示不管有没有异常都要执行的代码
python
try:
【可能发生异常的代码】
except:
【捕获异常后执行的代码】
finally:
【不管有没有异常都要执行的代码】
- else 块和 finally 块一起使用
python
try:
【可能发生异常的代码】
except:
【捕获异常后执行的代码】
else:
【如果没有异常要执行的代码】
finally:
【不管有没有异常都要执行的代码】
2、演示
- else 块
python
# test1
try:
result = 1 / 0
except:
print("test1 发生异常")
else:
print("test1 没有发生异常,执行这行代码")
# test2
try:
result = 1 * 0
except:
print("test2 发生异常")
else:
print("test2 没有发生异常,执行这行代码")
# 输出结果
test1 发生异常
test2 没有发生异常,执行这行代码
- finally 块
python
# test1
try:
result = 1 / 0
except:
print("test1 发生异常")
finally:
print("test1 不管有没有发生异常,都执行这行代码")
# test2
try:
result = 1 * 0
except:
print("test2 发生异常")
finally:
print("test2 不管有没有发生异常,都执行这行代码")
# 输出结果
test1 发生异常
test1 不管有没有发生异常,都执行这行代码
test2 不管有没有发生异常,都执行这行代码
- else 块和 finally 块一起使用
python
# test1
try:
result = 1 / 0
except:
print("test1 发生异常")
else:
print("test1 没有发生异常,执行这行代码")
finally:
print("test1 不管有没有发生异常,都执行这行代码")
# test2
try:
result = 1 * 0
except:
print("test2 发生异常")
else:
print("test2 没有发生异常,执行这行代码")
finally:
print("test2 不管有没有发生异常,都执行这行代码")
# 输出结果
test1 发生异常
test1 不管有没有发生异常,都执行这行代码
test2 没有发生异常,执行这行代码
test2 不管有没有发生异常,都执行这行代码
二、异常传递
1、基本介绍
-
异常是具有传递性的,当一个传递的异常没有(在各个函数中)被捕获时,一直传递出去,程序就会报错
-
利用异常传递,可以在最外层设置异常捕获,这样可以确保所有的异常都会被捕获,程序不会报错
2、演示
python
def fn1(): # 异常在 fn1() 中没有被捕获
print("fn1 开始")
1 / 0
print("fn1 结束")
def fn2(): # 异常在 fn2() 中没有被捕获
print("fn2 开始")
fn1()
print("fn2 结束")
# 异常在这里被捕获
try:
fn2()
except ZeroDivisionError as e:
print(e)
# 输出结果
fn2 开始
fn1 开始
division by zero
三、自定义异常
1、基本介绍
-
自定义异常通过继承内置的 Exception 类来实现的
-
自定义异常允许定义具有特定行为的错误类型,用于处理特定于应用程序的错误
2、演示
python
class MyCustomError(Exception):
def __init__(self, message, error_code):
self.message = message
self.error_code = error_code
def __str__(self):
return f"[Error {self.error_code}]: {self.message}"
def check(value):
if value < 0:
raise MyCustomError("输入值不合法", 400)
try:
check(-10)
except MyCustomError as e:
print(e)
# 输出结果
[Error 400]: 输入值不合法