ZetCode

Python 异常

最后修改于 2025 年 2 月 24 日

Python 中的异常是在程序执行过程中发生的、中断正常指令流程的事件。Python 使用 try-except 块提供了一个强大的异常处理机制。本教程涵盖了异常的基础知识、如何处理它们以及编写清晰、可维护代码的最佳实践。

异常是在程序执行期间发生的错误。当发生异常时,Python 会创建一个异常对象并停止程序,除非该异常被处理。常见的异常包括 ZeroDivisionErrorTypeErrorFileNotFoundError

处理除零错误

此示例演示了如何使用 try-except 块处理除零错误。

division_by_zero.py
try:
    result = 10 / 0
except ZeroDivisionError:
    print("Error: Division by zero is not allowed.")

try 块包含可能引发异常的代码。如果发生 ZeroDivisionError,则执行 except 块,并打印错误消息。

处理多个异常

此示例演示了如何使用单个 try-except 块处理多个异常。

multiple_exceptions.py
try:
    num = int(input("Enter a number: "))
    result = 10 / num
except ValueError:
    print("Error: Invalid input. Please enter a valid number.")
except ZeroDivisionError:
    print("Error: Division by zero is not allowed.")

try 块尝试将用户输入转换为整数并执行除法。如果发生 ValueErrorZeroDivisionError,则会执行相应的 except 块。

使用 else 子句

此示例演示了如何在 try-except 块中使用 else 子句。

else_clause.py
try:
    num = int(input("Enter a number: "))
    result = 10 / num
except ValueError:
    print("Error: Invalid input. Please enter a valid number.")
except ZeroDivisionError:
    print("Error: Division by zero is not allowed.")
else:
    print(f"Result: {result}")

如果 try 块中没有发生异常,则执行 else 块。当 try 块成功运行时,它对于应该只运行的代码很有用。

使用 finally 子句

此示例演示了如何在 try-except 块中使用 finally 子句。

finally_clause.py
try:
    file = open("example.txt", "r")
    content = file.read()
except FileNotFoundError:
    print("Error: File not found.")
finally:
    file.close()
    print("File closed.")

无论是否发生异常,都会执行 finally 块。它通常用于清理操作,例如关闭文件或释放资源。

引发自定义异常

此示例演示了如何使用 raise 关键字引发自定义异常。

custom_exception.py
def check_age(age):
    if age < 0:
        raise ValueError("Age cannot be negative.")
    elif age < 18:
        raise ValueError("You must be at least 18 years old.")
    else:
        print("Access granted.")

try:
    check_age(-5)
except ValueError as e:
    print(f"Error: {e}")

如果年龄为负数或低于 18 岁,check_age 函数将引发 ValueError。异常会在 try-except 块中被捕获和处理。

创建自定义异常类

此示例演示了如何通过继承 Exception 类来创建自定义异常类。

custom_exception_class.py
class InvalidAgeError(Exception):
    def __init__(self, message="Invalid age."):
        self.message = message
        super().__init__(self.message)

def check_age(age):
    if age < 0:
        raise InvalidAgeError("Age cannot be negative.")
    elif age < 18:
        raise InvalidAgeError("You must be at least 18 years old.")
    else:
        print("Access granted.")

try:
    check_age(-5)
except InvalidAgeError as e:
    print(f"Error: {e}")

InvalidAgeError 类是继承自 Exception 的自定义异常。它在 check_age 函数中引发,并在 try-except 块中被捕获。

异常处理最佳实践

来源

Python 异常文档

在本文中,我们探讨了 Python 异常,并通过实际示例演示了如何有效地处理它们。

作者

我的名字是 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Python 教程