Python - 异常处理
你好,未来的Python巫师们!我很激动能作为你们的向导,在这个令人兴奋的旅程中带你们进入Python异常处理的世界。作为一个教编程多年的老师,我可以告诉你,理解异常就像学习骑自行车带训练轮一样——一开始可能看起来有点棘手,但是一旦你掌握了它,你很快就会平稳地巡航!
什么是异常?
在我们深入探讨之前,先从基础开始。想象一下你在烤蛋糕(请跟我来,我保证这与Python有关!)。你有你的食谱(你的代码),你的原料(你的数据),你一切都准备好了。但是,如果你在做到一半时发现鸡蛋不够了呢?在烘焙世界里,这就是一个异常!
在Python中,异常是在程序执行期间发生的错误。它就像一个红旗,突然出现并说:“嘿,等等!有点不对劲!”
来看一个简单的例子:
print(10 / 0)
如果你运行这段代码,Python会抛出一个ZeroDivisionError
。它在说:“嘿,你不能除以零!在我的厨房里...我是说,编程环境中,这是不允许的!”
Python中的异常处理
现在我们知道什么是异常了,让我们学习如何优雅地处理它们。在Python中,我们使用try
和except
块来捕获和处理异常。
以下是基本结构:
try:
# 可能引发异常的代码
except 异常类型:
# 处理异常的代码
让我们修改我们之前的例子:
try:
result = 10 / 0
print(result)
except ZeroDivisionError:
print("哎呀!你不能除以零。")
当你运行这段代码时,它不会崩溃,而是会打印:“哎呀!你不能除以零。”
没有指定异常的except子句
有时,你可能想要捕获发生的任何异常。在这种情况下,你可以使用没有指定异常类型的except
子句:
try:
# 一些有风险的代码
x = int(input("输入一个数字:"))
y = 10 / x
print(y)
except:
print("出问题了!")
这将捕获try
块中发生的任何异常。但是,通常最好是尽可能捕获具体的异常,因为这会使你的代码更精确,更容易调试。
带有多个异常的except子句
你还可以在单个except
子句中处理多个异常:
try:
x = int(input("输入一个数字:"))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("输入无效或除以零!")
这段代码将捕获ValueError
(如果用户输入非数字值)和ZeroDivisionError
。
try-finally子句
finally
子句用于无论是否发生异常都必须执行的代码。它就像派对后的清理队伍——无论如何都会出现!
try:
f = open("example.txt", "r")
# 对文件执行一些操作
except FileNotFoundError:
print("文件不存在!")
finally:
f.close() # 这将始终执行,即使发生异常
异常的参数
异常可以携带额外的信息。你可以在except
块中访问这些信息:
try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"发生了一个错误:{e}")
这将打印:“发生了一个错误:除数不能为零”
引发异常
有时,你可能想要自己引发一个异常。这就像在游戏中担任裁判并判犯规:
def check_age(age):
if age < 0:
raise ValueError("年龄不能为负!")
print(f"你的年龄是{age}")
try:
check_age(-5)
except ValueError as e:
print(e)
这将打印:“年龄不能为负!”
用户定义的异常
你还可以创建自己的异常类型。这就像在游戏中发明一条新规则:
class TooManyPizzasError(Exception):
pass
def order_pizza(number):
if number > 100:
raise TooManyPizzasError("你不能订购超过100个披萨!")
print(f"{number}个披萨的订单已成功下单。")
try:
order_pizza(101)
except TooManyPizzasError as e:
print(e)
Python中的断言
断言是一种确保满足某些条件的方法。它们就像是代码中的小检查点:
def divide(a, b):
assert b != 0, "除数不能为零!"
return a / b
try:
result = divide(10, 0)
except AssertionError as e:
print(e)
这将打印:“除数不能为零!”
标准异常
Python附带了一套内置的异常。以下是一些最常见的:
异常名称 | 描述 |
---|---|
ZeroDivisionError | 当发生除以零或模运算时抛出 |
ValueError | 当函数获得正确类型但不当值的参数时抛出 |
TypeError | 当对不适当类型的对象应用操作或函数时抛出 |
NameError | 当找不到局部或全局名称时抛出 |
FileNotFoundError | 当请求的文件或目录不存在时抛出 |
IndexError | 当序列下标超出范围时抛出 |
KeyError | 当字典键不存在时抛出 |
ImportError | 当导入语句失败时抛出 |
就这样,各位!你们刚刚完成了Python异常处理的速成课程。请记住,异常不是你的敌人——它们更像是帮助你的路标,引导你编写更好、更健壮的代码。继续练习,继续实验,很快你就能像专业人士一样处理异常了。编程愉快!
Credits: Image by storyset