什么是异常?

在编程中,异常是指程序运行时出现的错误或意外情况。这些问题可能会导致程序无法正常执行。如果不妥善处理,程序可能会崩溃或停止运行。

Python 提供了一套完善的异常处理机制,允许我们捕获和处理这些错误,使程序更加健壮和友好。


1. 异常的定义

异常是在程序运行时发生的错误。例如:

  • 用户输入了无效的数据。
  • 试图打开一个不存在的文件。
  • 计算过程中出现除以零的错误。
  • 使用了未定义的变量。

这些错误会触发异常对象,并中断程序的正常流程。


2. 异常的示例

常见异常

以下是一些常见的 Python 异常:

  • ZeroDivisionError: 除以零时引发。
  • FileNotFoundError: 文件未找到时引发。
  • ValueError: 函数接收到无效参数时引发。
  • IndexError: 列表索引超出范围时引发。

代码示例

# 除以零错误
print(10 / 0)  # ZeroDivisionError: division by zero

# 文件未找到错误
with open("nonexistent_file.txt", "r") as file:
    content = file.read()  # FileNotFoundError

# 无效的值
num = int("abc")  # ValueError: invalid literal for int()

3. 异常处理

为了避免程序崩溃,我们可以使用 Python 的 异常处理机制。它的核心是 try-except 块:

语法

try:
    # 可能发生异常的代码
except 异常类型:
    # 处理异常的代码

示例

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误:不能除以零!")

# 输出:
# 错误:不能除以零!

4. 捕获多种异常

可以在一个 try 块中处理多种异常,分别使用不同的 except 块。

示例

try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
except ValueError:
    print("输入无效,请输入一个数字!")
except ZeroDivisionError:
    print("错误:不能除以零!")

# 测试用例:
# 输入 "abc" 输出:输入无效,请输入一个数字!
# 输入 0 输出:错误:不能除以零!

5. 使用 elsefinally

  • else:在 try 块没有引发异常时执行。
  • finally:无论是否引发异常,都会执行。

示例

try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
except ValueError:
    print("输入无效,请输入一个数字!")
except ZeroDivisionError:
    print("错误:不能除以零!")
else:
    print(f"结果是:{result}")
finally:
    print("程序执行结束。")

# 测试:
# 输入 2 输出:
# 结果是:5.0
# 程序执行结束。

6. 自定义异常

Python 允许我们定义自己的异常,用于处理特定的错误场景。

定义自定义异常

自定义异常需要继承自 Exception 类。

class CustomError(Exception):
    pass

示例

class NegativeNumberError(Exception):
    def __init__(self, value):
        self.value = value

try:
    num = int(input("请输入一个正数:"))
    if num < 0:
        raise NegativeNumberError(num)  # 手动触发异常
except NegativeNumberError as e:
    print(f"错误:输入了负数 {e.value}!")

7. 异常处理的意义

  • 避免程序崩溃:即使遇到错误,也能让程序继续执行。
  • 增强用户体验:用友好的提示代替难以理解的报错信息。
  • 方便调试:定位问题并记录日志。

8. 小结

  • 异常是在运行时可能出现的错误。
  • 使用 try-except 捕获并处理异常,避免程序崩溃。
  • elsefinally 提供更灵活的流程控制。
  • 自定义异常适用于特定业务需求。

妥善处理异常,不仅是写好代码的基本要求,也是提高软件稳定性的重要手段。