Python - 引发异常
大家好,渴望成为Pythonista的朋友们!今天,我们将深入探讨Python中引发异常的激动人心的世界。如果你是编程新手,不用担心——我会一步一步地引导你理解这个概念,就像我多年来教过的无数学生一样。所以,拿一杯你最喜欢的饮料,让我们一起踏上这个Python冒险之旅吧!
Python中引发异常
想象一下,你正在烹饪一顿美味的饭菜,但突然你发现缺少了一个关键的食材。你会怎么做?你可能会停止烹饪并提醒所有人出了问题,对吧?这正是Python中引发异常的全部含义——这是一种表示代码中发生了意外或问题的情况的方式。
为什么引发异常?
引发异常允许我们做到以下几点:
- 指示错误或异常情况
- 控制程序的流程
- 向用户或其他代码部分提供有意义的反馈
让我们从一个简单的例子开始:
def divide(a, b):
if b == 0:
raise ValueError("不能除以零!")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"哎呀!发生了一个错误:{e}")
在这个例子中,当有人尝试除以零时,我们引发了ValueError
。让我们来分解一下:
- 我们定义了一个函数
divide(a, b)
,它检查b
是否为零。 - 如果
b
为零,我们引发一个带有自定义消息的ValueError
。 - 我们使用
try-except
块来捕获异常并打印一条友好的消息。
运行这段代码,你会看到:
哎呀!发生了一个错误:不能除以零!
引发内置异常
Python自带了许多我们可以引发的内置异常。以下是一些常见异常的表格:
异常名称 | 描述 |
---|---|
ValueError | 当函数接收到正确类型但值不合适的参数时引发 |
TypeError | 当对不适当类型的对象应用操作或函数时引发 |
IndexError | 当序列下标超出范围时引发 |
KeyError | 当字典中找不到键时引发 |
FileNotFoundError | 当请求的文件或目录不存在时引发 |
让我们看一些例子:
def check_age(age):
if not isinstance(age, int):
raise TypeError("年龄必须是整数")
if age < 0:
raise ValueError("年龄不能为负")
print(f"你的年龄是{age}")
try:
check_age("二十")
except TypeError as e:
print(f"类型错误:{e}")
try:
check_age(-5)
except ValueError as e:
print(f"值错误:{e}")
运行这段代码,你会看到:
类型错误:年龄必须是整数
值错误:年龄不能为负
引发自定义异常
有时,内置异常并不满足我们的需求。这时,我们就创建自己的自定义异常!这就像一个大厨创造自己独特的食谱。
创建自定义异常
要创建自定义异常,我们只需定义一个从Exception
类继承的新类:
class TooManyPizzasError(Exception):
pass
def order_pizza(number):
if number > 100:
raise TooManyPizzasError("哇!这么多披萨应付不过来!")
print(f"订单确认:{number}个披萨")
try:
order_pizza(101)
except TooManyPizzasError as e:
print(f"订单失败:{e}")
在这个美味的例子中:
- 我们定义了一个自定义异常
TooManyPizzasError
。 - 我们的
order_pizza
函数在有人订购超过100个披萨时引发这个异常。 - 我们捕获异常并打印一条友好的消息。
运行这段代码,你会看到:
订单失败:哇!这么多披萨应付不过来!
重新引发异常
有时,你可能想要捕获一个异常,对其进行一些处理,然后重新引发它供其他人处理。这就像在游戏中传递一个热土豆!
以下是操作方法:
def risky_operation():
print("开始有风险的操作...")
raise ValueError("出问题了!")
def perform_operation():
try:
risky_operation()
except ValueError:
print("捕获到错误,正在记录...")
raise # 重新引发异常
try:
perform_operation()
except ValueError as e:
print(f"操作失败:{e}")
在这个例子中:
-
risky_operation()
总是引发一个ValueError
。 -
perform_operation()
捕获异常,记录它,然后重新引发它。 - 我们在外部的
try-except
块中捕获重新引发的异常。
运行这段代码,你会看到:
开始有风险的操作...
捕获到错误,正在记录...
操作失败:出问题了!
好了,各位!我们已经介绍了引发异常、内置异常、自定义异常,甚至重新引发异常。请记住,异常不是你的敌人——它们是有价值的工具,可以帮助你编写健壮且抗错误的代码。
我总是告诉我的学生,编程就像学习骑自行车。你可能会有几次跌倒,但每次跌倒(或异常)都会教你一些新东西。继续练习,保持好奇心,不要害怕在途中引发一些异常!
编程愉快,愿你的异常总是有意为之!?✨
Credits: Image by storyset