Skip to main content

Python 错误处理

Python 错误处理基础

在编写Python程序时,错误是不可避免的。文件可能不存在,用户输入可能无效,或者网络连接可能中断。错误处理机制可以帮助程序在遇到异常情况时优雅地应对,而不是直接崩溃。错误处理的核心目标是:捕获并处理运行时错误,提供清晰的错误信息 确保程序的健壮性和稳定性

try-except 基本语法

Python内置了多种异常类型,用于表示不同类型的错误。以下是一些常见的异常:

  • ZeroDivisionError:除以零时触发
  • FileNotFoundError:尝试访问不存在的文件
  • TypeError:操作或函数应用于不适当的类型
  • ValueError:函数接收到正确类型但值不合适的参数
  • IndexError:序列索引超出范围

了解这些异常类型有助于针对性地处理错误。以下是一个展示多种异常的示例:

def process_data(data, index):
    try:
        result = 10 / data
        lst = [1, 2, 3]
        value = lst[index]
        return value
    except Exception as e:
        print(f"An error occurred: {e}")

# 触发 ZeroDivisionError
process_data(0, 1)
# 触发 IndexError
process_data(5, 10)

输出:

An error occurred: division by zero
An error occurred: list index out of range

Python使用try-except结构来捕获和处理异常。基本语法如下:

  • try块包含可能引发异常的代码
  • except块定义如何处理特定异常

以下是一个简单的示例,处理除以零的错误:

def divide_numbers(a, b):
    try:
        result = a / b
        print(f"Result: {result}")
    except ZeroDivisionError:
        print("Error: Cannot divide by zero!")

# 测试代码
divide_numbers(10, 2)  # 正常情况
divide_numbers(10, 0)  # 触发异常

输出:

Result: 5.0
Error: Cannot divide by zero!

在这个例子中,try块尝试执行除法运算。如果b为0,ZeroDivisionError会被捕获,程序会执行except块中的代码,而不会崩溃。

捕获特定异常

捕获所有异常(使用except Exception)可能掩盖未预期的错误,因此最好只捕获特定的异常类型。可以通过列出多个except块来处理不同类型的异常。

以下是一个处理多种异常的示例:

def access_list_item(lst, index):
    try:
        value = lst[index]
        print(f"Value at index {index}: {value}")
    except IndexError:
        print("Error: Index out of range!")
    except TypeError:
        print("Error: Invalid index type!")

# 测试代码
my_list = [1, 2, 3]
access_list_item(my_list, 1)    # 正常情况
access_list_item(my_list, 5)    # 触发 IndexError
access_list_item(my_list, "2")  # 触发 TypeError

输出:

Value at index 1: 2
Error: Index out of range!
Error: Invalid index type!

在这个例子中,程序分别处理了IndexErrorTypeError,并为每种异常提供了特定的错误消息。捕获特定异常可以让代码更清晰,也便于调试。

else和finally子句

除了tryexcept,Python还提供了elsefinally子句,增强了错误处理的灵活性:

  • else:在try块没有引发异常时执行
  • finally:无论是否发生异常,都会执行(常用于清理资源)

以下是一个综合示例,展示elsefinally的用法:

def read_file_content(filename):
    try:
        file = open(filename, 'r')
        content = file.read()
    except FileNotFoundError:
        print(f"Error: File '{filename}' not found!")
    else:
        print("File read successfully!")
        print(f"Content: {content}")
    finally:
        try:
            file.close()
            print("File closed.")
        except NameError:
            print("No file to close.")

# 测试代码
read_file_content("example.txt")  # 文件不存在
read_file_content("sample.txt")   # 假设 sample.txt 存在并包含 "Hello, World!"

输出(假设example.txt不存在,sample.txt存在):

Error: File 'example.txt' not found!
No file to close.
File read successfully!
Content: Hello, World!
File closed.

在这个例子中:

  • 如果文件不存在,except FileNotFoundError会捕获错误
  • 如果文件成功读取,else块会打印内容
  • finally块确保文件被关闭(如果文件被打开),无论是否发生异常

总结

  • 常见的异常类型及其触发场景
  • 使用try-except捕获异常
  • 针对特定异常进行处理
  • 使用elsefinally增强错误处理逻辑