什么是异常处理?
在Python中,异常是一个事件,该事件会在程序执行期间发生,影响程序的正常流程。当Python脚本遇到一个错误时,它将创建一个异常对象。如果这个异常没有被处理,程序将终止并显示一个错误信息。异常处理是确保程序健壮性和错误管理的关键机制。
常见的异常错误
SyntaxError
:语法错误IndexError
:索引超出序列的范围KeyError
:字典中查找一个不存在的关键字FileNotFoundError
:输入/输出操作失败,文件未找到ValueError
:传入无效的参数TypeError
:操作或函数应用于不适当类型的对象ZeroDivisionError
:尝试除以零时OverflowError
:数值计算结果太大而无法表示MemoryError
:程序运行时内存不足AssertionError
:断言语句(assert
)失败时抛出
基本异常处理语句
Python中的异常处理主要依赖于四个关键词:try
, except
, else
, 和 finally
。
- try: 这个块让Python尝试执行其中的代码。如果代码执行过程中发生异常,Python将停止当前块的执行,并寻找相应的
except
块。 - except: 这部分代码在
try
块中的代码引发异常时执行。可以指定一个特定的异常来捕获,或者一系列异常放在一个元组中,或者捕获所有异常。 - else: 如果
try
块没有引发异常,将执行这个块的代码。(可选) - finally: 无论是否引发了异常,
finally
块中的代码都会被执行。这常用于执行一些清理工作,例如关闭文件。(可选)
try:
result = 10 / 0
except ZeroDivisionError:
print("不能除以零")
else:
print(f"除法成功,结果为: {result}")
finally:
print("运行完成,可能成功或者失败")
可以通过一个except
子句来捕获多个异常,方法是将异常类作为元组列出。
try:
x = int(input("请输入一个数字: "))
result = 10 / x
except (ZeroDivisionError, ValueError) as e:
print("发生错误:", str(e))
else:
print("输入有效,结果为", result)
或者通过多个expect
子句来分别捕获异常
try:
x = int(input("请输入一个数字: "))
result = 10 / x
except ZeroDivisionError as err1:
print("发生错误:", str(err1))
except ValueError as err2:
print("发生错误:", str(err2))
else:
print("输入有效,结果为", result)
创建和使用自定义异常
在更复杂的应用中,可能需要定义自己的异常类型。自定义异常通过继承**Exception
**类(或其子类)来创建。
class MyError(Exception):
def __init__(self, message):
self.message = message
def __str__(self):
return self.message
try:
raise MyError("发生了一个自定义错误")
except MyError as e:
print("捕获到自定义异常:", e)
关于类会在之后进行一次简单的总结
异常的传递
如果一个异常在当前的except
块中未被处理,它将被传递到上一层的try
块中,直到被处理或程序被迫停止。
def func():
try:
x = 1 / 0
except KeyError:
print("捕获 KeyError")
finally:
print("清理操作")
try:
func()
except ZeroDivisionError:
print("捕获除零错误")
断言(Assertions)
除了标准的异常处理,Python还提供了assert
语句。assert
用于检查代码中的某个条件,如果条件为假,则引发AssertionError
。
x = 1
assert x > 0, "x 必须大于 0"
注意事项
- 精确捕获异常:尽可能具体地捕获异常。这有助于准确地了解程序中可能出现的错误类型,并使错误处理更加明确。
- 清理资源:使用
finally
块或上下文管理器来确保文件和网络连接等资源被正确关闭。 - 避免过度使用
try-except
:不应该用异常处理来控制正常的程序流程。 - 记录异常:在生产环境中,将异常信息记录到日志中是一个好习惯。
这样的异常处理策略能够让Python程序更加健壮,并能在面对不确定和意外情况时,保持控制和稳定性。