异常处理

简介: 【8月更文挑战第12天】

在 Python 爬虫中,异常处理是一个重要的环节,它可以帮助我们处理在爬取过程中可能遇到的各种问题,如网络请求错误、数据解析错误、文件写入错误等。通过异常处理,我们可以确保爬虫的稳定性和数据的准确性。

以下是一些常见的异常处理方法和代码示例:

1. 处理请求异常

在使用 requests 发送网络请求时,可能会遇到连接错误、超时等异常。

代码示例

import requests
from requests.exceptions import HTTPError, ConnectionError, Timeout

url = 'http://example.com'
try:
    response = requests.get(url, timeout=5)
    response.raise_for_status()  # 检查请求是否成功
except HTTPError as http_err:
    print(f'HTTP error occurred: {http_err}')  # HTTP 错误处理
except ConnectionError as conn_err:
    print(f'Connection error occurred: {conn_err}')  # 连接错误处理
except Timeout as timeout_err:
    print(f'Timeout error occurred: {timeout_err}')  # 超时错误处理
except Exception as err:
    print(f'An error occurred: {err}')  # 其他错误处理

2. 处理解析异常

在使用 BeautifulSoup 解析 HTML 时,可能会遇到找不到标签或属性的错误。

代码示例

from bs4 import BeautifulSoup, Tag

html = '<html><head></head><body><p>Example</p></body></html>'
try:
    soup = BeautifulSoup(html, 'html.parser')
    tag = soup.find('a')  # 尝试找到一个 <a> 标签
    if not isinstance(tag, Tag):
        raise ValueError("Tag not found")
except ValueError as e:
    print(e)

3. 处理文件操作异常

在读写文件时,可能会遇到文件不存在、权限不足等异常。

代码示例

try:
    with open('file.txt', 'r') as file:
        content = file.read()
except FileNotFoundError:
    print("File not found")
except IOError as e:
    print(f'File error occurred: {e}')

4. 处理数据存储异常

在将数据存储到数据库或其他存储系统时,可能会遇到连接失败、数据格式错误等异常。

代码示例(以 SQLite 数据库为例):

import sqlite3

try:
    conn = sqlite3.connect('example.db')
    cursor = conn.cursor()
    cursor.execute('SELECT * FROM non_existent_table')  # 尝试查询一个不存在的表
except sqlite3.DatabaseError as e:
    print(f'Database error occurred: {e}')
finally:
    conn.close()

5. 处理自定义异常

有时候,我们可能需要定义自己的异常来处理特定的错误情况。

代码示例

class DataFormatError(Exception):
    """Exception raised for errors in the input data format."""

def process_data(data):
    if not isinstance(data, dict):
        raise DataFormatError("Data should be a dictionary")
    # 处理数据

try:
    process_data(some_data)
except DataFormatError as e:
    print(e)

6. 使用 finally 确保资源释放

finally 块中的代码无论是否发生异常都会执行,这通常用于确保资源(如文件或网络连接)被正确关闭。

代码示例

try:
    resource = acquire_resource()
    # 使用资源进行操作
except Exception as e:
    print(f'An error occurred: {e}')
finally:
    release_resource(resource)

7. 使用 else 仅在没有异常时执行

else 块中的代码仅在没有异常发生时才会执行。

代码示例

try:
    # 尝试执行的操作
    pass
except SomeException as e:
    print(e)
else:
    # 如果没有异常发生,执行这里的代码
    print("Operation successful")
目录
相关文章
|
2月前
try...except异常处理
【10月更文挑战第16天】try except的一些异常处理方法
36 2
|
3月前
|
Python
ython之对异常处理
ython之对异常处理
|
7月前
|
C++
C++程序异常处理
C++程序异常处理
46 1
|
7月前
|
C++
11. C++异常处理
11. C++异常处理
47 0
11. C++异常处理
|
C#
C#异常处理
C#异常处理
67 0
|
7月前
|
C++
C++ 异常处理
C++ 异常处理
|
7月前
|
C++
C++异常处理详解
C++异常处理详解
40 0
|
7月前
|
存储 C++
63异常处理
63异常处理
34 0
|
Java 编译器 C++
C++异常处理
C++异常处理
40 0