Python捕获异常
Python捕获异常主要通过try-except
语句实现,以下是核心语法和使用场景:
一、基础捕获结构
try: # 可能引发异常的代码 result = 10 / 0 except ZeroDivisionError: # 处理特定异常 print(\"除数不能为零\")
二、捕获多种异常
try: # 可能引发多种异常的代码 value = int(\"abc\") except (ValueError, TypeError) as e: # 处理多个异常类型 print(f\"输入错误:{e}\")
三、捕获所有异常
用Exception
捕获所有非系统退出的异常(不推荐滥用,优先用具体异常类型):
try: risky_operation() except Exception as e: print(f\"发生未知错误:{e}\")
四、else
和finally
子句
-
else
:无异常时执行,位于except
之后。try: x = 10 / 2 except ZeroDivisionError: print(\"除零错误\") else: print(\"计算结果:\", x) # 输出:计算结果:5.0
-
finally
:无论是否异常都会执行,常用于释放资源(如关闭文件)。try: file = open(\"data.txt\", \"r\") data = file.read() except FileNotFoundError: print(\"文件不存在\") finally: file.close() # 确保文件被关闭 print(\"资源已释放\")
五、异常传递与自定义异常
-
异常传递:异常会从引发处向上传递,可在调用栈中逐层捕获。
def func1(): raise ValueError(\"参数错误\") def func2(): func1() try: func2() except ValueError as e: print(f\"捕获到异常:{e}\") # 输出:捕获到异常:参数错误
-
自定义异常:继承
Exception
类创建业务专用异常。class InsufficientBalanceError(Exception): def __init__(self, balance, amount): super().__init__(f\"余额不足:当前{balance}元,需{amount}元\") try: if balance < amount: raise InsufficientBalanceError(balance, amount) except InsufficientBalanceError as e: print(e) # 输出:余额不足:当前100元,需150元
六、最佳实践
-
精准捕获:优先用具体异常类型(如
ZeroDivisionError
),避免用裸except:
。 -
资源管理:用
try/finally
或上下文管理器(with
)确保资源释放。 -
日志记录:在
except
中记录异常信息(如logging.error
),便于调试。