Python Tutorials

精通Python异常处理

Spread the love

异常处理是编写健壮的Python程序的关键组成部分。它允许你优雅地处理程序执行过程中可能出现的错误,防止程序崩溃并为用户提供信息反馈。本教程深入探讨了Python异常处理的基本概念。

目录

  1. try…except
  2. raise Exception
  3. try…finally
  4. 常见的内置异常
  5. 创建自定义异常

1. try…except

try...except块是异常处理的基础。可能引发异常的代码放在try块中。如果发生异常,则执行相应的except块。


try:
    result = 10 / 0  # 这将引发ZeroDivisionError
except ZeroDivisionError:
    print("错误:除以零!")
except TypeError:
    print("错误:类型不匹配")
except Exception as e:  # 捕获任何其他异常
    print(f"发生意外错误:{e}")
else:  # 可选的else块,如果没有发生异常则执行
    print(f"结果:{result}")
finally:  # 可选的finally块,总是执行
    print("这段代码总是执行。")

此示例演示了如何处理ZeroDivisionError。多个except块可以处理不同的异常类型。可选的else块仅在try块中没有发生异常时才执行。可选的finally块总是执行,非常适合用于清理任务,例如关闭文件。

2. raise Exception

raise语句允许你显式地引发异常,从而发出错误或异常情况的信号。


def validate_age(age):
    if age < 0:
        raise ValueError("年龄不能为负数")
    elif age > 120:
        raise ValueError("年龄不现实地高")
    return age

try:
    age = validate_age(-5)
    print(f"有效的年龄:{age}")
except ValueError as e:
    print(f"错误:{e}")

在这里,如果年龄无效,validate_age会引发ValueError。你可以引发任何内置异常或创建自定义异常(继承自Exception的类)。

3. try…finally

finally块确保其中的代码始终执行,无论是否发生异常。这对于清理工作至关重要。


file = None
try:
    file = open("my_file.txt", "r")
    content = file.read()
    print(content)
except FileNotFoundError:
    print("文件未找到!")
finally:
    if file:
        file.close()
    print("文件已关闭。")

这保证即使发生FileNotFoundError,文件也会被关闭,从而防止资源泄漏。

4. 常见的内置异常

Python提供了许多内置异常:

  • ZeroDivisionError:除以零。
  • TypeError:操作的类型不当。
  • ValueError:类型正确,但值不当。
  • FileNotFoundError:文件未找到。
  • IndexError:索引超出范围。
  • KeyError:字典中找不到键。
  • ImportError:导入失败。
  • NameError:名称未找到。

5. 创建自定义异常

为了更具体的错误处理,可以通过继承Exception类来创建自定义异常:


class InvalidInputError(Exception):
    pass

def process_data(data):
    if not data:
        raise InvalidInputError("数据不能为空")
    # ...其余数据处理...

try:
    process_data("")
except InvalidInputError as e:
    print(f"自定义错误:{e}")

这允许更细粒度的错误处理和改进的代码可读性。

有效的异常处理对于编写健壮可靠的Python程序至关重要。通过预测和优雅地处理潜在的错误,你可以构建更强大和用户友好的应用程序。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注