除了上述常见的 try - except 结构处理异常外,Python 还有一些相关要点:
异常的传递
当函数中发生异常但未在该函数内处理时,异常会向上传递到调用该函数的地方。如果一直没有被处理,最终会导致程序崩溃并显示异常信息。
def divide(a, b):
return a / b
def main():
try:
divide(10, 0)
except ZeroDivisionError:
print("在main函数中捕获到除零异常")
main()
在 divide 函数中,10 / 0 会引发 ZeroDivisionError,由于该函数没有处理此异常,异常传递到 main 函数,main 函数捕获并处理了它。
捕获所有异常
虽然不推荐在大多数情况下使用,但可以使用一个 except 不指定异常类型来捕获所有异常。
try:
num = int('abc')
result = 10 / num
except:
print("发生了异常")
不过这种方式无法区分不同类型的异常,不利于调试和处理特定的错误情况,在实际应用中应尽量避免。
重新引发异常
在 except 块中可以捕获异常并在某些情况下重新引发它,可能是为了进行额外的处理或让更上层的调用者处理。
def process_number():
try:
num = int('abc')
except ValueError as ve:
print("捕获到值错误,重新引发...")
raise ve
try:
process_number()
except ValueError:
print("在外部捕获到重新引发的值错误")
在 process_number 函数中,捕获 ValueError 后打印一些信息,然后使用 raise ve 重新引发相同的异常,外部的 try - except 块再次捕获并处理该异常。
使用 assert 语句进行简单异常处理
assert 语句用于调试,它会测试一个条件,如果条件为假,会引发 AssertionError 异常。
def divide(a, b):
assert b != 0, "除数不能为零"
return a / b
try:
result = divide(10, 0)
except AssertionError as ae:
print(f"断言错误: {ae}")
这里使用 assert 确保除数不为零,如果违反该条件,AssertionError 异常会被引发,外部的 try - except 块捕获并处理。