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
),便于调试。