Python - 引发异常

大家好,渴望成为Pythonista的朋友们!今天,我们将深入探讨Python中引发异常的激动人心的世界。如果你是编程新手,不用担心——我会一步一步地引导你理解这个概念,就像我多年来教过的无数学生一样。所以,拿一杯你最喜欢的饮料,让我们一起踏上这个Python冒险之旅吧!

Python - Raising Exceptions

Python中引发异常

想象一下,你正在烹饪一顿美味的饭菜,但突然你发现缺少了一个关键的食材。你会怎么做?你可能会停止烹饪并提醒所有人出了问题,对吧?这正是Python中引发异常的全部含义——这是一种表示代码中发生了意外或问题的情况的方式。

为什么引发异常?

引发异常允许我们做到以下几点:

  1. 指示错误或异常情况
  2. 控制程序的流程
  3. 向用户或其他代码部分提供有意义的反馈

让我们从一个简单的例子开始:

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。让我们来分解一下:

  1. 我们定义了一个函数divide(a, b),它检查b是否为零。
  2. 如果b为零,我们引发一个带有自定义消息的ValueError
  3. 我们使用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}")

在这个美味的例子中:

  1. 我们定义了一个自定义异常TooManyPizzasError
  2. 我们的order_pizza函数在有人订购超过100个披萨时引发这个异常。
  3. 我们捕获异常并打印一条友好的消息。

运行这段代码,你会看到:

订单失败:哇!这么多披萨应付不过来!

重新引发异常

有时,你可能想要捕获一个异常,对其进行一些处理,然后重新引发它供其他人处理。这就像在游戏中传递一个热土豆!

以下是操作方法:

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}")

在这个例子中:

  1. risky_operation()总是引发一个ValueError
  2. perform_operation()捕获异常,记录它,然后重新引发它。
  3. 我们在外部的try-except块中捕获重新引发的异常。

运行这段代码,你会看到:

开始有风险的操作...
捕获到错误,正在记录...
操作失败:出问题了!

好了,各位!我们已经介绍了引发异常、内置异常、自定义异常,甚至重新引发异常。请记住,异常不是你的敌人——它们是有价值的工具,可以帮助你编写健壮且抗错误的代码。

我总是告诉我的学生,编程就像学习骑自行车。你可能会有几次跌倒,但每次跌倒(或异常)都会教你一些新东西。继续练习,保持好奇心,不要害怕在途中引发一些异常!

编程愉快,愿你的异常总是有意为之!?✨

Credits: Image by storyset