学习Python异常处理需掌握错误与异常区别、try-except基础、多异常捕获、else/finally用法、raise与自定义异常及with语句;常见错误有SyntaxError、NameError、TypeError、ValueError、IndexError、KeyError、FileNotFoundError和ZeroDivisionError;自定义异常通过继承Exception类实现,用于明确业务逻辑错误;合理使用异常可提升程序健壮性和可维护性,但滥用会导致性能下降和调试困难。

学习Python的错误与异常处理,其实就是学着如何让你的代码变得更“皮实”,不再那么一碰就碎。它不只是
try-except
学习路线图:
首先,我们得明白什么是错误,什么是异常。这就像区分“语法错误”和“运行时错误”。语法错误是代码还没跑起来就错,IDE会告诉你;异常是代码跑起来了,但在执行过程中发生了不符合预期的事。
接着,从最基础的
try-except
立即学习“Python免费学习笔记(深入)”;
try:
# 可能会出错的代码块
result = 10 / 0
except ZeroDivisionError:
# 捕获并处理特定类型的错误
print("噢,除零错误发生了!")这里,你得知道怎么捕获
ValueError
TypeError
FileNotFoundError
然后,你会遇到需要处理多种异常的情况。
try:
# ...
except (ValueError, TypeError):
print("值类型或数据类型不对劲。")
except FileNotFoundError:
print("文件没找到,检查路径。")
except Exception as e: # 捕获所有其他未预料的异常
print(f"发生了一个未知的错误: {e}")注意,
except Exception as e
再进一步,引入
else
finally
else
try
try
finally
try
file = None
try:
file = open("my_data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("文件不存在,创建一个新的吧。")
except Exception as e:
print(f"读取文件时发生其他错误: {e}")
else:
print("文件读取成功,没有遇到任何问题。")
finally:
if file:
file.close() # 确保文件总是被关闭
print("文件句柄已关闭。")接下来是主动抛出异常(raise
def check_age(age):
if not isinstance(age, int):
raise TypeError("年龄必须是整数。")
if age < 0 or age > 150:
raise ValueError("年龄不在合理范围。")
print(f"年龄 {age} 合法。")如果内置异常不够用,你可以创建自己的异常类,让你的错误信息更具业务含义,这通常通过继承
Exception
最后,别忘了上下文管理器(with
with open("another_data.txt", "w") as f:
f.write("Hello, context manager!")
# 文件在这里会自动关闭,即使上面写入时出错在写Python代码的时候,我们总会碰到各种各样的“拦路虎”,也就是错误和异常。它们各有特点,理解它们能帮助我们更快地定位问题。
最常见的一种是
SyntaxError
然后是运行时异常,这些是代码跑起来后才暴露出来的。
NameError
print(my_var)
my_var
TypeError
"hello" + 5
ValueError
TypeError
int("abc")int()
"abc"
IndexError
KeyError
IndexError
KeyError
FileNotFoundError
ZeroDivisionError
AttributeError
"hello".append("world")append
理解这些常见错误,就像是拥有了一份故障排除的速查表,能让你在面对程序报错时,心里有个底,知道从哪个方向着手去解决。
自定义异常,说白了,就是当你觉得Python内置的那些异常类型不足以清晰地表达你程序中遇到的特定问题时,自己动手造一个。这就像在通用词典里找不到一个特别精准的词来描述你的感受,于是你创造了一个新词。
什么时候需要它呢? 首先,当你的业务逻辑需要更具体的错误描述时。比如,你正在开发一个电商系统,用户尝试购买一个库存不足的商品。
ValueError
InsufficientStockError
Exception
如何定义它呢?其实很简单,就是创建一个新的类,让它继承自
Exception
ValueError
# 定义一个自定义异常
class InsufficientStockError(Exception):
"""
当商品库存不足时抛出的自定义异常。
"""
def __init__(self, item_id, requested_qty, available_qty, message="库存不足"):
self.item_id = item_id
self.requested_qty = requested_qty
self.available_qty = available_qty
self.message = (f"{message}: 商品ID {item_id}, "
f"请求数量 {requested_qty}, "
f"可用库存 {available_qty}")
super().__init__(self.message) # 调用基类的构造函数
# 使用自定义异常的例子
def purchase_item(item_id, quantity):
stock_db = {
"apple": 10,
"banana": 5
}
available_qty = stock_db.get(item_id, 0)
if quantity > available_qty:
raise InsufficientStockError(item_id, quantity, available_qty)
stock_db[item_id] -= quantity
print(f"成功购买 {quantity} 个 {item_id}。")
try:
purchase_item("apple", 12)
except InsufficientStockError as e:
print(f"购买失败: {e}")
print(f"错误详情: 商品ID {e.item_id}, 请求 {e.requested_qty}, 可用 {e.available_qty}")
except Exception as e:
print(f"发生了一个未知错误: {e}")
try:
purchase_item("banana", 3)
except InsufficientStockError as e:
print(f"购买失败: {e}")
except Exception as e:
print(f"发生了一个未知错误: {e}")通过继承,你的自定义异常就具备了普通异常的所有行为,同时你还能在其中添加自己的属性和方法,让错误信息更丰富。
异常处理,这把双刃剑,用得好能让程序坚不可摧,用得不好则可能变成性能瓶颈或维护噩梦。
从性能上看,抛出和捕获异常确实是有开销的。它比简单的
if
except
try-except
if key in dict:
dict.get(key)
Python社区里有个说法叫“EAFP”(Easier to Ask Forgiveness Than Permission),即“与其请求许可,不如直接行动,错了再道歉”。这和“LBYL”(Look Before You Leap),即“三思而后行”是相对的。Python在很多场景下鼓励EAFP,比如访问字典键,如果知道键大概率存在,直接访问然后捕获
KeyError
if key in dict:
再来看可维护性,这是异常处理的真正价值所在。 优点:
except
缺点:
except Exception:
总的来说,一个设计良好的异常处理机制,能显著提升代码的可读性、鲁棒性和可维护性,但前提是我们要明智地使用它,避免将其用于常规控制流,并确保捕获的异常得到有意义的处理,而不是被简单地忽略。
以上就是Python 错误与异常处理学习路线图的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号