Python 爬虫技术 第05节 异常处理

在 Python 中,异常处理是一种控制程序流程的重要机制,它允许程序在遇到错误时优雅地处理这些错误,而不是突然崩溃。异常处理通常使用 tryexceptelsefinally 块来实现。

下面是一个结合单词管理系统的示例,我们将演示如何使用异常处理来管理文件操作和数据处理中的潜在错误:

1. 异常处理的基本结构

try:
    # 尝试执行的代码块
    pass
except ExceptionType as e:
    # 如果发生特定类型的异常,执行此代码块
    pass

2. 示例:读取单词列表并处理异常

假设我们有一个单词列表存储在一个文本文件中,我们想要读取这个文件并将单词添加到一个列表中。这里可能会出现多种异常,如文件不存在或文件无法打开等。

def read_word_list(filename):
    try:
        with open(filename, 'r') as file:
            word_list = [line.strip() for line in file]
        return word_list
    except FileNotFoundError:
        print(f"Error: The file {filename} does not exist.")
    except IOError:
        print(f"Error: An I/O error occurred while trying to read {filename}.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    finally:
        print("The read operation has been completed.")

word_list = read_word_list('words.txt')
print(word_list)

3. 使用 else

else 块包含当没有异常发生时要执行的代码。

def read_word_list(filename):
    try:
        with open(filename, 'r') as file:
            word_list = [line.strip() for line in file]
    except Exception as e:
        print(f"An error occurred: {e}")
    else:
        print("File was successfully read.")
        return word_list
    finally:
        print("The read operation has been completed.")

4. 处理多个异常

可以有多个 except 块来捕获不同类型的异常,并对它们进行不同的处理。

def read_word_list(filename):
    try:
        with open(filename, 'r') as file:
            word_list = [line.strip() for line in file]
    except FileNotFoundError:
        print(f"The file {filename} does not exist.")
    except IOError:
        print(f"An I/O error occurred while trying to read {filename}.")
    except ValueError:
        print(f"Invalid data format found in {filename}.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    else:
        print("File was successfully read.")
        return word_list
    finally:
        print("The read operation has been completed.")

5. 抛出自定义异常

你还可以创建自定义异常类来处理特定的错误情况。

class WordListError(Exception):
    def __init__(self, message):
        super().__init__(message)

def read_word_list(filename):
    try:
        with open(filename, 'r') as file:
            word_list = [line.strip() for line in file if line.strip()]
            if not word_list:
                raise WordListError("The file is empty.")
            return word_list
    except WordListError as wle:
        print(wle)
    except Exception as e:
        print(f"An unexpected error occurred: {e}")
    finally:
        print("The read operation has been completed.")

通过上述示例,你可以看到异常处理如何帮助你更好地控制程序的执行流程,确保即使在出错的情况下也能保持程序的稳定性和可用性。

继续扩展上面的单词管理系统,增加一些功能并进一步展示如何在更复杂的场景下使用异常处理。

假设我们的系统需要从用户那里接收一个单词列表文件名,并且能够将单词写入另一个文件。此外,系统还需要能够处理一些常见的输入错误,比如空文件、文件格式错误、以及文件操作时可能出现的任何其他异常。

以下是一个使用异常处理的完整示例:

import sys

class WordListError(Exception):
    """自定义异常类,用于处理与单词列表相关的错误。"""
    def __init__(self, message):
        super().__init__(message)

def read_word_list(filename):
    """从给定的文件中读取单词列表。"""
    try:
        with open(filename, 'r') as file:
            word_list = [line.strip() for line in file]
            if not word_list:
                raise WordListError("The file is empty.")
            return word_list
    except FileNotFoundError:
        print(f"Error: The file {filename} does not exist.")
    except IOError:
        print(f"Error: An I/O error occurred while trying to read {filename}.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

def write_word_list(word_list, filename):
    """将单词列表写入指定的文件。"""
    try:
        with open(filename, 'w') as file:
            for word in word_list:
                file.write(word + '\n')
        print(f"Words have been successfully written to {filename}.")
    except IOError:
        print(f"Error: An I/O error occurred while trying to write to {filename}.")
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

def main():
    if len(sys.argv) != 3:
        print("Usage: python script.py <input_file> <output_file>")
        sys.exit(1)

    input_file = sys.argv[1]
    output_file = sys.argv[2]

    try:
        words = read_word_list(input_file)
        if words is None:
            raise WordListError("No words were read from the file.")
        write_word_list(words, output_file)
    except WordListError as wle:
        print(wle)
    except Exception as e:
        print(f"An unexpected error occurred: {e}")

if __name__ == "__main__":
    main()

在这个示例中,我们增加了以下几个方面:

  1. 命令行参数处理:程序现在接受两个参数,即输入文件名和输出文件名。如果参数数量不正确,程序将显示使用说明并退出。

  2. 异常处理在主函数中main() 函数现在包含了一个 try-except 块,以处理在读取和写入文件过程中可能发生的异常。这包括了 WordListError,这是一个自定义异常,用于处理特定于单词列表的错误。

  3. 函数分离read_word_list()write_word_list() 分别负责读取和写入文件。这样做的好处是代码更加模块化,易于维护和测试。

通过这种方式,我们可以确保程序在遇到错误时能够给出清晰的反馈,并尽可能地恢复到可操作状态,而不是无预警地崩溃。

相关推荐

  1. Python 爬虫技术 05 异常处理

    2024-07-21 22:06:04       44 阅读
  2. python 爬虫技术 02 基础复习

    2024-07-21 22:06:04       26 阅读
  3. python 爬虫技术 04 函数和模块

    2024-07-21 22:06:04       36 阅读
  4. python 爬虫技术 03 基础复习 控制结构

    2024-07-21 22:06:04       32 阅读
  5. Python爬虫技术 08 Cookies和Session

    2024-07-21 22:06:04       30 阅读
  6. Python 爬虫技术 06 HTTP协议与Web基础知识

    2024-07-21 22:06:04       22 阅读
  7. Python爬虫--异常处理

    2024-07-21 22:06:04       34 阅读
  8. Python爬虫异步与缓存技巧浅析

    2024-07-21 22:06:04       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 22:06:04       172 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 22:06:04       190 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 22:06:04       158 阅读
  4. Python语言-面向对象

    2024-07-21 22:06:04       171 阅读

热门阅读

  1. 微信小程序开发:DOM 相关 API 使用详解

    2024-07-21 22:06:04       36 阅读
  2. QtQuick-QML语法

    2024-07-21 22:06:04       34 阅读
  3. Codeforces Round 960 (Div. 2)VP

    2024-07-21 22:06:04       37 阅读
  4. WebAssembly在前端开发中的创新与应用

    2024-07-21 22:06:04       37 阅读
  5. easyExcel

    easyExcel

    2024-07-21 22:06:04      39 阅读
  6. 什么是等保测评

    2024-07-21 22:06:04       32 阅读
  7. acml可用订阅到起始位姿

    2024-07-21 22:06:04       34 阅读
  8. Windows 12 网页版

    2024-07-21 22:06:04       31 阅读
  9. 网络融合的艺术:Xcode中应用Web服务集成全指南

    2024-07-21 22:06:04       41 阅读
  10. 提示工程的技术与策略分类

    2024-07-21 22:06:04       35 阅读
  11. css font 优化

    2024-07-21 22:06:04       36 阅读
  12. 基于深度学习的金融交易

    2024-07-21 22:06:04       42 阅读
  13. MATLAB中balance函数用法

    2024-07-21 22:06:04       40 阅读
  14. 栈和队列之间有哪些区别

    2024-07-21 22:06:04       37 阅读
  15. python 爬虫技术 第04节 函数和模块

    2024-07-21 22:06:04       36 阅读
  16. 打造安全堡垒:Xcode应用权限管理全解析

    2024-07-21 22:06:04       35 阅读