如何在 Python 中捕获多个异常:简单指南

在 Python 中捕获异常有助于确保您的程序更少崩溃。 这使您的代码更加可靠并提供更好的用户体验。 在本文中,我将讨论如何在 Python 中的同一个 try/ except 块中捕获多个异常。

Python 中的异常是什么?

Python、异常是不同程序部分之间的一种通信机制。 这种通信机制允许系统的一部分进行通信,表示它遇到了不知道如何处理的严重错误。

因此,它引发了一个例外。 知道如何处理错误的程序的另一部分将捕获异常并正确处理错误。

如果不处理异常,程序就会崩溃。 因此,处理异常可以防止程序崩溃并使其更加可靠。

对于本文,我假设您已经熟悉引发和处理异常的基础知识,Python Try/Except 简介文章中对此进行了介绍。

Python 中处理多个异常的重要性

  • 它减少了代码重复,因为多个异常由同一块处理。 这使得代码更容易阅读、编辑和删除。
  • 它还可以帮助您编写更高效的代码,因为错误类型只需检查一次而不是多次。

处理多个异常

捕获多个异常是指使用同一个 except 块捕获多个异常的情况。 在 Python 中,您可以在各个 except 块中捕获不同的异常。

或者,当您想以类似的方式处理异常时,可以使用一个块来处理它们。 为此,您需要捕获多个异常。 在本节中,我将通过示例解释如何做到这一点。

#1. 捕获不同块中的不同异常

假设我们有一个程序旨在接受两个不同的值并将它们相除。 在此程序中,我们预计当用户输入无效值时会引发不同类型的异常。 特别是,我们想要处理 ValueError 和 ZeroDivisionError。

当用户输入无法转换为整数的值时,将引发 ValueError。 当第二个数字为零时,将引发 ZeroDivisionError。 在这两种情况下,我们希望显示一条错误消息:“您输入了无效值”。

为了实现上述目的,我们可以编写以下代码:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except ValueError as e:
    print("You entered an invalid value")
except ZeroDivisionError as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

如果我们运行上面的代码和无法转换为整数的文本,结果将是:

  如何解锁华为调制解调器

如果我们输入第二个数字 0,结果将是:

代码按预期工作,但请注意,我们以类似的方式处理 ValueError 和 ZeroDivisionError。 因此,两个 except 块之间存在大量代码重复。 这并不理想,因为我们违反了编程中的 DRY 原则。 DRY 原则说的是不要重复自己。

因此,我们可以将两个块合并为一个捕获多个异常的块,而不是单独编写代码。 如果我们这样做,我们就可以避免重复。

#2. 在一个 except 块中捕获多个异常

为了捕获多个异常,我们提供了一个元组来指定我们想要捕获的所有错误。 下面是一个示例,我们在一个 except 块中捕获 ValueError 和 ZeroDivisionError:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

这是比之前的代码更好的实现。 本质上,这就是处理多个异常的目的。 上面的代码的工作方式与以前相同。 如果您使用前面的示例进行测试,它应该像以前一样工作:

#3。 确定捕获了哪个异常

当捕获 ValueError 或 ZeroDivisionError 时,上面的代码将执行第一个 except 块。 在某些情况下,您可能希望针对这两个错误执行代码,并希望针对其中一个错误执行某些其他代码,但不想针对另一个错误执行。

在这种情况下,您必须首先确定捕获到了什么错误并执行适当的代码。

要确定已捕获哪个异常,可以在 except 块内使用 if/else 块。 例如:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")

    if isinstance(e, ValueError):
        print('Value Error')
    else:
        print('Zero Division Error')
except Exception as e:
    print("Something went wrong")

在此块中,除了打印 ValueError 和 ZeroDivisionError 的通用错误消息之外,我们还准确检查捕获的错误类型并打印附加消息。 如果我们再次测试代码,我们应该会看到一些特定于捕获的异常的附加消息。

  如何在Word中插入一行

您什么时候想要处理多个异常?

在一般情况下,当您想要对可能引发的类似异常执行相同的代码时,处理多个异常是理想的选择。 这包括以下内容:

  • 由于不同原因失败的网络请求。 无论如何,您可能希望通知用户无法访问服务器。
  • 数据库连接失败,会产生多个错误。 尽管这些错误可能不同,但您的处理可能是相同的。
  • 文件 I/O 也会产生可以类似处理的错误,例如权限和磁盘已满错误。

结论

本文讨论了通过同时捕获多个异常来将多个 except 块合并为一个。 这有助于您的代码变得更具可读性和可维护性。 接下来,您可能想阅读这篇关于您应该尝试的 Python 初学者项目的文章。