Python: 错误处理与异常(Error Handling and Exceptions)在 Python 中,错误处理和异常是用来管理程序执行过程中发生的错误或意外情况的机制。这使得程序能够在遇到问题时不会崩溃,而是能够进行适当的处理或回应。
异常(Exceptions)是什么?
异常是指在程序执行过程中发生的意外事件,这些事件会导致程序的正常执行被中断。当 Python 遇到异常时,会引发一个异常对象,这个对象包含了错误的类型和相关信息。
异常的类型
Python 常见例外类型异常是指在程序执行过程中发生的意外事件,通常会导致程序的正常执行被中断。常见的异常类型包括:
- SyntaxError:语法错误。
- TypeError:数据类型不匹配。
- ValueError:传入的参数值不正确。
- IndexError:索引list超出序列的范围。
- KeyError:字典dist中不存在该键。
- ZeroDivisionError:除以零的错误。
- RecursionError:当一个函数的递归调用层数超过了 Python 设定的最大递归深度时
- 无限递归:当函数不断自我调用而没有终止条件,导致调用层数不断增加。
def infinite_recursion():
return infinite_recursion() # 没有终止条件
infinite_recursion() # 这里会引发 RecursionError- 过深的递归:即使有终止条件,如果递归的层数过多,也可能超过最大递归深度。
- def deep_recursion(n):
if n == 0:
return
else:
deep_recursion(n - 1) # 递归调用deep_recursion(10000) # 如果超过最大递归深度,会引发 RecursionError
- NameError :
- 使用一个未被定义或不在当前作用域中的变数或是
- 变数名称拼写错误
- 当变数在某个作用域内定义,但在另一个作用域中使用时,会引发 NameError。
- FileNotFoundError:当你尝试访问一个不存在的档案或目录时,会引发这个异常。
异常的处理通常使用 try 和 except 语句来进行:
try:
# 尝试执行的代码
result = 10 / 0 # 这将引发 ZeroDivisionError
except ZeroDivisionError:
# 异常处理代码
print("不能除以零!")
在这个例子中,当执行 10 / 0 时,会引发 ZeroDivisionError,控制权会转移到 except 区块,从而避免程序崩溃。
LBYE & EAFP
在 Python 中,LBYE(Look Before You Leap)和EAFP(Easier to Ask for Forgiveness than Permission)是两种不同的编程风格或错误处理策略。
def get_item_from_list(my_list, index):
if index < len(my_list): # 检查索引是否在范围内
return my_list[index]
else:
return None # 或者引发异常
在这个例子中,函数在访问列表的元素之前,先检查索引是否有效。
def get_item_from_list(my_list, index):
try:
return my_list[index] # 尝试直接访问列表元素
except IndexError:
return None # 异常处理
在这个例子中,函数尝试直接访问列表的元素,如果索引无效,则捕获 IndexError 异常并进行处理。
小结
LBYE:在执行操作之前进行检查,以确保条件满足,从而避免错误。EAFP:直接执行操作,并在发生错误时进行异常处理,这样的方式在 Python 中更常见,因为它与 Python 的设计哲学相符。这两种方法各有优缺点,选择哪一种取决于具体的情况和需求。
错误处理的方式
Python 提供了 try、except、else 和 finally 语句来处理异常。
try:
# 尝试执行的代码
result = 10 / 0 # 这将引发 ZeroDivisionError
except ZeroDivisionError:
# 异常处理代码
print("不能除以零!")
else:
# 如果没有异常发生,执行这部分
print("计算结果:", result)
finally:
# 无论是否发生异常,这部分都会执行
print("执行完毕。")
各部分的作用
raise
在 Python 中,可以使用 raise 语句来抛出异常,并在回调函数中捕获和处理这些异常。它允许你创建自定义的异常,或者引发内置的异常类型。
def divide(a, b):
if b == 0:
raise ZeroDivisionError("Cannot divide by zero")
return a / b
try:
result = divide(10, 0)
except ZeroDivisionError as e:
print(e)
在这个例子中,如果 b 为 0,divide 函数会主动抛出 ZeroDivisionError 异常。在 try-except 块中,我们捕获并处理了这个异常。
使用 raise 语句可以帮助你在代码中更好地处理错误情况,提高程序的健壮性和可维护性。