Python - 异常处理

你好,未来的Python巫师们!我很激动能作为你们的向导,在这个令人兴奋的旅程中带你们进入Python异常处理的世界。作为一个教编程多年的老师,我可以告诉你,理解异常就像学习骑自行车带训练轮一样——一开始可能看起来有点棘手,但是一旦你掌握了它,你很快就会平稳地巡航!

Python - Exceptions

什么是异常?

在我们深入探讨之前,先从基础开始。想象一下你在烤蛋糕(请跟我来,我保证这与Python有关!)。你有你的食谱(你的代码),你的原料(你的数据),你一切都准备好了。但是,如果你在做到一半时发现鸡蛋不够了呢?在烘焙世界里,这就是一个异常!

在Python中,异常是在程序执行期间发生的错误。它就像一个红旗,突然出现并说:“嘿,等等!有点不对劲!”

来看一个简单的例子:

print(10 / 0)

如果你运行这段代码,Python会抛出一个ZeroDivisionError。它在说:“嘿,你不能除以零!在我的厨房里...我是说,编程环境中,这是不允许的!”

Python中的异常处理

现在我们知道什么是异常了,让我们学习如何优雅地处理它们。在Python中,我们使用tryexcept块来捕获和处理异常。

以下是基本结构:

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