Python Trae提示词开发实战(12):AI实现API自动化批量调用与数据处理让效率提升10倍

做API开发的朋友都知道,批量调用API是最耗时的环节之一。前几年我做过一个数据聚合项目,要从几十个不同的API获取数据,然后整合到一起。那时候不懂自动化,每天早上打开终端,一个API一个API地调,解析返回的数据,整理格式,一上午就过去了。

后来接触了Trae,发现它生成的API自动化代码特别实用。现在不管是RESTful API、GraphQL还是WebSocket,只要把API文档说清楚,它就能生成完整的自动化代码,包括批量调用、数据解析、错误处理,一气呵成。原来要一上午的活儿,现在几分钟就搞定。

今天就分享我是怎么用Trae搞定API自动化的,这些方法都是实战中摸索出来的,希望能帮到大家。

技巧1:用Trae提示词生成requests批量调用API代码

实际场景

记得刚开始做API开发时,最头疼的就是批量调用。比如要从天气API获取100个城市的天气数据,得写个循环,一个一个地调,还要处理各种异常:网络超时、API限流、数据格式错误。那时候经常要调试半天。

有一次要批量调用一个第三方API获取用户数据,我写了半天代码,结果因为API限流被封锁了,又得重新设计请求策略。后来用Trae,只要把API文档和需求说清楚,它就能生成完整的批量调用代码,包括并发控制、错误重试、数据缓存,半小时就搞定了。

Trae提示词技巧

刚开始用Trae时,我只会说"帮我调用API",结果生成的代码要么太简单,要么不符合我的需求。后来我发现,只要把API文档、请求参数、响应格式说清楚,Trae生成的代码就能直接用。

优化前:

复制代码
帮我调用API

优化后:

复制代码
编写一个Python API批量调用工具,使用requests库,要求:

1. 核心功能:
   - 支持批量调用API
   - 支持并发控制(限制并发数)
   - 支持请求重试(指数退避)
   - 支持请求限流(速率限制)
   - 支持数据缓存(避免重复请求)

2. 请求管理:
   - 支持GET/POST/PUT/DELETE方法
   - 支持请求头自定义
   - 支持请求参数和请求体
   - 支持Cookie和Session管理
   - 支持代理IP设置

3. 错误处理:
   - 网络超时处理
   - HTTP错误处理(4xx, 5xx)
   - API限流处理(429)
   - 数据解析错误处理
   - 自动重试机制

4. 数据存储:
   - 支持保存为Excel/CSV/JSON
   - 支持增量更新
   - 支持数据去重
   - 支持数据验证

5. 代码要求:
   - 使用面向对象编程
   - 添加详细的中文注释和日志
   - 实现异常处理和错误恢复
   - 支持配置文件
   - 遵循PEP 8代码规范

6. 输出要求:
   - 生成可执行的API调用脚本
   - 生成调用日志文件
   - 生成数据文件(Excel/CSV/JSON)
   - 可选:生成调用报告

这样写就把API调用的需求说清楚了,Trae生成的代码基本能直接用。

生成的代码

复制代码
import requests
import time
import json
import logging
import pandas as pd
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from datetime import datetime
from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path


@dataclass
class APIRequest:
    """API请求"""
    url: str
    method: str = 'GET'
    params: Optional[Dict] = None
    headers: Optional[Dict] = None
    data: Optional[Dict] = None
    json_data: Optional[Dict] = None
    timeout: int = 30


@dataclass
class APIResponse:
    """API响应"""
    url: str
    status_code: int
    data: Optional[Dict] = None
    error: Optional[str] = None
    elapsed_time: float = 0.0


@dataclass
class APICallReport:
    """API调用报告"""
    timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
    total_requests: int = 0
    successful_requests: int = 0
    failed_requests: int = 0
    total_time: float = 0.0
    average_time: float = 0.0
    responses: List[APIResponse] = field(default_factory=list)


class APIClient:
    """API客户端"""
    
    def __init__(self, config: Optional[Dict] = None):
        """初始化客户端"""
        self.config = config or self._load_default_config()
        self.session = requests.Session()
        self.logger = self._setup_logger()
        
        # 设置默认请求头
        self.session.headers.update(self.config.get('default_headers', {}))
        
        self.logger.info("API客户端初始化完成")
    
    def _setup_logger(self) -> logging.Logger:
        """设置日志"""
        logger = logging.getLogger('APIClient')
        logger.setLevel(logging.INFO)
        
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        
        return logger
    
    def _load_default_config(self) -> Dict:
        """加载默认配置"""
        return {
            'max_concurrent': 5,
            'max_retries': 3,
            'retry_delay': 1,
            'timeout': 30,
            'default_headers': {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
            }
        }
    
    def call_api(self, request: APIRequest) -> APIResponse:
        """调用单个API"""
        start_time = time.time()
        
        try:
            self.logger.info(f"调用API: {request.method} {request.url}")
            
            response = self.session.request(
                method=request.method,
                url=request.url,
                params=request.params,
                headers=request.headers,
                data=request.data,
                json=request.json_data,
                timeout=request.timeout
            )
            
            elapsed_time = time.time() - start_time
            
            # 处理响应
            if response.status_code == 200:
                try:
                    data = response.json()
                    self.logger.info(f"API调用成功: {request.url} (状态码: {response.status_code})")
                    return APIResponse(
                        url=request.url,
                        status_code=response.status_code,
                        data=data,
                        elapsed_time=elapsed_time
                    )
                except json.JSONDecodeError:
                    self.logger.warning(f"API返回数据不是JSON格式: {request.url}")
                    return APIResponse(
                        url=request.url,
                        status_code=response.status_code,
                        data={'text': response.text},
                        elapsed_time=elapsed_time
                    )
            else:
                error_msg = f"API调用失败: {request.url} (状态码: {response.status_code})"
                self.logger.error(error_msg)
                return APIResponse(
                    url=request.url,
                    status_code=response.status_code,
                    error=error_msg,
                    elapsed_time=elapsed_time
                )
        
        except requests.exceptions.Timeout:
            error_msg = f"API调用超时: {request.url}"
            self.logger.error(error_msg)
            return APIResponse(
                url=request.url,
                status_code=0,
                error=error_msg,
                elapsed_time=time.time() - start_time
            )
        
        except requests.exceptions.RequestException as e:
            error_msg = f"API调用异常: {request.url} - {str(e)}"
            self.logger.error(error_msg)
            return APIResponse(
                url=request.url,
                status_code=0,
                error=error_msg,
                elapsed_time=time.time() - start_time
            )
    
    def call_api_with_retry(self, request: APIRequest) -> APIResponse:
        """带重试的API调用"""
        max_retries = self.config.get('max_retries', 3)
        retry_delay = self.config.get('retry_delay', 1)
        
        for attempt in range(max_retries):
            response = self.call_api(request)
            
            # 如果成功或不是可重试的错误,直接返回
            if response.status_code == 200 or response.status_code not in [0, 429, 500, 502, 503, 504]:
                return response
            
            # 如果是最后一次尝试,直接返回
            if attempt == max_retries - 1:
                return response
            
            # 指数退避
            delay = retry_delay * (2 ** attempt)
            self.logger.warning(f"API调用失败,{delay}秒后重试 (尝试 {attempt + 1}/{max_retries}): {request.url}")
            time.sleep(delay)
        
        return response
    
    def batch_call_apis(self, requests: List[APIRequest]) -> APICallReport:
        """批量调用API"""
        self.logger.info(f"开始批量调用API,共 {len(requests)} 个请求")
        
        report = APICallReport()
        start_time = time.time()
        
        max_concurrent = self.config.get('max_concurrent', 5)
        
        with ThreadPoolExecutor(max_workers=max_concurrent) as executor:
            futures = {executor.submit(self.call_api_with_retry, req): req for req in requests}
            
            for future in as_completed(futures):
                response = future.result()
                report.responses.append(response)
                
                if response.status_code == 200:
                    report.successful_requests += 1
                else:
                    report.failed_requests += 1
        
        report.total_requests = len(requests)
        report.total_time = time.time() - start_time
        report.average_time = report.total_time / len(requests) if requests else 0
        
        self.logger.info(f"批量调用完成,成功: {report.successful_requests}, 失败: {report.failed_requests}")
        
        return report
    
    def save_responses(self, responses: List[APIResponse], output_path: str, format: str = 'json'):
        """保存响应数据"""
        try:
            # 提取成功响应的数据
            data_list = []
            for response in responses:
                if response.status_code == 200 and response.data:
                    data_list.append(response.data)
            
            if format == 'json':
                with open(output_path, 'w', encoding='utf-8') as f:
                    json.dump(data_list, f, indent=2, ensure_ascii=False)
            
            elif format == 'csv':
                df = pd.DataFrame(data_list)
                df.to_csv(output_path, index=False, encoding='utf-8-sig')
            
            elif format == 'excel':
                df = pd.DataFrame(data_list)
                df.to_excel(output_path, index=False, engine='openpyxl')
            
            self.logger.info(f"响应数据已保存: {output_path}")
        
        except Exception as e:
            self.logger.error(f"保存响应数据失败: {str(e)}")
            raise
    
    def generate_report(self, report: APICallReport, output_path: str):
        """生成调用报告"""
        try:
            with open(output_path, 'w', encoding='utf-8') as f:
                json.dump({
                    'timestamp': report.timestamp,
                    'summary': {
                        'total_requests': report.total_requests,
                        'successful_requests': report.successful_requests,
                        'failed_requests': report.failed_requests,
                        'success_rate': f"{report.successful_requests / report.total_requests * 100:.2f}%" if report.total_requests > 0 else "0%",
                        'total_time': f"{report.total_time:.2f}秒",
                        'average_time': f"{report.average_time:.2f}秒"
                    },
                    'responses': [
                        {
                            'url': response.url,
                            'status_code': response.status_code,
                            'error': response.error,
                            'elapsed_time': f"{response.elapsed_time:.2f}秒"
                        }
                        for response in report.responses
                    ]
                }, f, indent=2, ensure_ascii=False)
            
            self.logger.info(f"调用报告已生成: {output_path}")
        
        except Exception as e:
            self.logger.error(f"生成调用报告失败: {str(e)}")
            raise


def main():
    """主函数"""
    client = APIClient()
    
    # 示例:批量调用天气API
    cities = ['北京', '上海', '广州', '深圳', '杭州']
    requests = [
        APIRequest(
            url=f'http://api.weatherapi.com/v1/current.json',
            params={'key': 'YOUR_API_KEY', 'q': city}
        )
        for city in cities
    ]
    
    # 批量调用
    report = client.batch_call_apis(requests)
    
    # 保存响应数据
    client.save_responses(report.responses, 'weather_data.json')
    
    # 生成报告
    client.generate_report(report, 'api_call_report.json')
    
    print(f"调用完成!")
    print(f"总请求数: {report.total_requests}")
    print(f"成功: {report.successful_requests}")
    print(f"失败: {report.failed_requests}")
    print(f"总耗时: {report.total_time:.2f}秒")
    print(f"平均耗时: {report.average_time:.2f}秒")


if __name__ == '__main__':
    main()

使用说明

这套API批量调用工具用起来挺方便的,我一般按这几个步骤来:

  1. 安装依赖

    pip install requests pandas openpyxl

  2. 配置API客户端

    config = {
    'max_concurrent': 5,
    'max_retries': 3,
    'retry_delay': 1,
    'timeout': 30,
    'default_headers': {
    'User-Agent': 'Mozilla/5.0',
    'Authorization': 'Bearer YOUR_TOKEN'
    }
    }
    client = APIClient(config)

  3. 批量调用API

    创建请求列表

    requests = [
    APIRequest(url='https://api.example.com/data/1'),
    APIRequest(url='https://api.example.com/data/2'),
    APIRequest(url='https://api.example.com/data/3')
    ]

    批量调用

    report = client.batch_call_apis(requests)

    保存数据

    client.save_responses(report.responses, 'data.json')

效果对比

用这套API批量调用工具后,调用效率确实提升了不少:

  • 以前手动调用API,要花2-3小时
  • 现在用Trae生成调用工具,10分钟就能搞定(包括写提示词)
  • 运行调用只要几分钟

算下来效率提升了10-20倍,而且数据质量也提高了不少。

技巧2:Trae提示词实现API数据自动解析与存储

实际场景

有一次要从多个API获取数据并整合到数据库。每个API返回的数据格式都不一样,有的是JSON,有的是XML,有的嵌套很深,有的字段名还不统一。那时候我花了整整一周才把数据解析和存储搞定。

后来我想,为什么不能建立一个自动解析和存储工具,自动处理各种数据格式呢?于是用Trae生成了一个数据解析和存储工具,现在不管API返回什么格式,都能自动解析并存储到数据库。

Trae提示词技巧

建立数据解析和存储工具,关键是要想清楚要处理哪些数据格式。我一开始也没头绪,后来慢慢摸索出一套方法。

优化前:

复制代码
帮我解析API数据

优化后:

复制代码
编写一个Python API数据自动解析与存储工具,要求:

1. 核心功能:
   - 支持多种数据格式解析(JSON、XML、CSV)
   - 支持数据字段映射和转换
   - 支持数据验证和清洗
   - 支持批量数据存储
   - 支持增量更新

2. 数据解析:
   - 自动识别数据格式
   - 支持嵌套数据提取
   - 支持字段重命名
   - 支持数据类型转换
   - 支持默认值设置

3. 数据存储:
   - 支持多种数据库(MySQL、PostgreSQL、SQLite)
   - 支持Excel/CSV/JSON文件存储
   - 支持数据去重
   - 支持数据备份
   - 支持事务处理

4. 代码要求:
   - 使用面向对象编程
   - 添加详细的中文注释和日志
   - 实现异常处理和错误恢复
   - 支持配置文件
   - 遵循PEP 8代码规范

5. 输出要求:
   - 生成可执行的解析脚本
   - 生成解析日志文件
   - 生成数据文件
   - 可选:生成解析报告

这样写就把数据解析和存储的需求说清楚了,Trae生成的工具基本能直接用。

生成的代码

复制代码
import json
import xml.etree.ElementTree as ET
import pandas as pd
import sqlite3
import logging
from typing import Dict, List, Optional, Any
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path


@dataclass
class DataMapping:
    """数据映射"""
    source_field: str
    target_field: str
    data_type: str = 'str'
    default_value: Any = None
    required: bool = False


@dataclass
class ParseReport:
    """解析报告"""
    timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
    total_records: int = 0
    successful_records: int = 0
    failed_records: int = 0
    errors: List[str] = field(default_factory=list)


class DataParser:
    """数据解析器"""
    
    def __init__(self, config: Optional[Dict] = None):
        """初始化解析器"""
        self.config = config or {}
        self.logger = self._setup_logger()
        
        self.logger.info("数据解析器初始化完成")
    
    def _setup_logger(self) -> logging.Logger:
        """设置日志"""
        logger = logging.getLogger('DataParser')
        logger.setLevel(logging.INFO)
        
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        
        return logger
    
    def parse_json(self, data: str, mappings: List[DataMapping]) -> List[Dict]:
        """解析JSON数据"""
        try:
            json_data = json.loads(data)
            
            if isinstance(json_data, list):
                return [self._map_record(record, mappings) for record in json_data]
            else:
                return [self._map_record(json_data, mappings)]
        
        except json.JSONDecodeError as e:
            self.logger.error(f"JSON解析失败: {str(e)}")
            return []
    
    def parse_xml(self, data: str, mappings: List[DataMapping], root_tag: str = 'record') -> List[Dict]:
        """解析XML数据"""
        try:
            root = ET.fromstring(data)
            records = []
            
            for item in root.findall(root_tag):
                record = {}
                for mapping in mappings:
                    element = item.find(mapping.source_field)
                    if element is not None:
                        record[mapping.target_field] = self._convert_type(
                            element.text,
                            mapping.data_type,
                            mapping.default_value
                        )
                    elif mapping.required:
                        raise ValueError(f"必填字段 {mapping.source_field} 缺失")
                    else:
                        record[mapping.target_field] = mapping.default_value
                
                records.append(record)
            
            return records
        
        except ET.ParseError as e:
            self.logger.error(f"XML解析失败: {str(e)}")
            return []
    
    def _map_record(self, record: Dict, mappings: List[DataMapping]) -> Dict:
        """映射记录"""
        mapped_record = {}
        
        for mapping in mappings:
            value = record.get(mapping.source_field)
            
            if value is None:
                if mapping.required:
                    raise ValueError(f"必填字段 {mapping.source_field} 缺失")
                mapped_record[mapping.target_field] = mapping.default_value
            else:
                mapped_record[mapping.target_field] = self._convert_type(
                    value,
                    mapping.data_type,
                    mapping.default_value
                )
        
        return mapped_record
    
    def _convert_type(self, value: Any, data_type: str, default_value: Any = None) -> Any:
        """转换数据类型"""
        try:
            if data_type == 'str':
                return str(value)
            elif data_type == 'int':
                return int(value)
            elif data_type == 'float':
                return float(value)
            elif data_type == 'bool':
                return bool(value)
            else:
                return value
        except (ValueError, TypeError):
            return default_value


class DataStorage:
    """数据存储"""
    
    def __init__(self, config: Optional[Dict] = None):
        """初始化存储"""
        self.config = config or {}
        self.logger = self._setup_logger()
        
        self.logger.info("数据存储初始化完成")
    
    def _setup_logger(self) -> logging.Logger:
        """设置日志"""
        logger = logging.getLogger('DataStorage')
        logger.setLevel(logging.INFO)
        
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        
        return logger
    
    def save_to_excel(self, data: List[Dict], output_path: str):
        """保存到Excel"""
        try:
            df = pd.DataFrame(data)
            df.to_excel(output_path, index=False, engine='openpyxl')
            self.logger.info(f"数据已保存到Excel: {output_path}")
        except Exception as e:
            self.logger.error(f"保存到Excel失败: {str(e)}")
            raise
    
    def save_to_csv(self, data: List[Dict], output_path: str):
        """保存到CSV"""
        try:
            df = pd.DataFrame(data)
            df.to_csv(output_path, index=False, encoding='utf-8-sig')
            self.logger.info(f"数据已保存到CSV: {output_path}")
        except Exception as e:
            self.logger.error(f"保存到CSV失败: {str(e)}")
            raise
    
    def save_to_json(self, data: List[Dict], output_path: str):
        """保存到JSON"""
        try:
            with open(output_path, 'w', encoding='utf-8') as f:
                json.dump(data, f, indent=2, ensure_ascii=False)
            self.logger.info(f"数据已保存到JSON: {output_path}")
        except Exception as e:
            self.logger.error(f"保存到JSON失败: {str(e)}")
            raise
    
    def save_to_sqlite(self, data: List[Dict], table_name: str, db_path: str):
        """保存到SQLite"""
        try:
            conn = sqlite3.connect(db_path)
            df = pd.DataFrame(data)
            df.to_sql(table_name, conn, if_exists='append', index=False)
            conn.commit()
            conn.close()
            self.logger.info(f"数据已保存到SQLite: {db_path}.{table_name}")
        except Exception as e:
            self.logger.error(f"保存到SQLite失败: {str(e)}")
            raise


class APIDataProcessor:
    """API数据处理器"""
    
    def __init__(self, config: Optional[Dict] = None):
        """初始化处理器"""
        self.config = config or {}
        self.parser = DataParser()
        self.storage = DataStorage()
        self.logger = self._setup_logger()
        
        self.logger.info("API数据处理器初始化完成")
    
    def _setup_logger(self) -> logging.Logger:
        """设置日志"""
        logger = logging.getLogger('APIDataProcessor')
        logger.setLevel(logging.INFO)
        
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        
        return logger
    
    def process_api_data(
        self,
        api_data: str,
        data_format: str,
        mappings: List[DataMapping],
        output_path: str,
        output_format: str = 'excel'
    ) -> ParseReport:
        """处理API数据"""
        report = ParseReport()
        
        try:
            # 解析数据
            if data_format == 'json':
                parsed_data = self.parser.parse_json(api_data, mappings)
            elif data_format == 'xml':
                parsed_data = self.parser.parse_xml(api_data, mappings)
            else:
                raise ValueError(f"不支持的数据格式: {data_format}")
            
            report.total_records = len(parsed_data)
            report.successful_records = len(parsed_data)
            
            # 存储数据
            if output_format == 'excel':
                self.storage.save_to_excel(parsed_data, output_path)
            elif output_format == 'csv':
                self.storage.save_to_csv(parsed_data, output_path)
            elif output_format == 'json':
                self.storage.save_to_json(parsed_data, output_path)
            else:
                raise ValueError(f"不支持的输出格式: {output_format}")
            
            self.logger.info(f"数据处理完成,共处理 {report.total_records} 条记录")
        
        except Exception as e:
            report.failed_records = report.total_records - report.successful_records
            report.errors.append(str(e))
            self.logger.error(f"数据处理失败: {str(e)}")
        
        return report


def main():
    """主函数"""
    processor = APIDataProcessor()
    
    # 示例:处理JSON数据
    json_data = '''
    [
        {"id": 1, "name": "张三", "age": 25},
        {"id": 2, "name": "李四", "age": 30},
        {"id": 3, "name": "王五", "age": 28}
    ]
    '''
    
    # 定义数据映射
    mappings = [
        DataMapping('id', '用户ID', 'int'),
        DataMapping('name', '姓名', 'str'),
        DataMapping('age', '年龄', 'int')
    ]
    
    # 处理数据
    report = processor.process_api_data(
        api_data=json_data,
        data_format='json',
        mappings=mappings,
        output_path='users.xlsx',
        output_format='excel'
    )
    
    print(f"处理完成!")
    print(f"总记录数: {report.total_records}")
    print(f"成功: {report.successful_records}")
    print(f"失败: {report.failed_records}")


if __name__ == '__main__':
    main()

使用说明

这套数据解析和存储工具用起来挺方便的,我一般按这几个步骤来:

  1. 安装依赖

    pip install pandas openpyxl

  2. 定义数据映射

    mappings = [
    DataMapping('id', '用户ID', 'int'),
    DataMapping('name', '姓名', 'str'),
    DataMapping('age', '年龄', 'int')
    ]

  3. 处理数据

    processor = APIDataProcessor()

    处理JSON数据

    report = processor.process_api_data(
    api_data=json_data,
    data_format='json',
    mappings=mappings,
    output_path='users.xlsx',
    output_format='excel'
    )

效果对比

用这套数据解析和存储工具后,数据处理效率确实提升了不少:

  • 以前手动解析和存储数据,要花2-3小时
  • 现在用Trae生成处理工具,10分钟就能搞定(包括写提示词)
  • 运行处理只要几分钟

算下来效率提升了10-20倍,而且数据质量也提高了不少。

技巧3:使用Trae生成错误重试与异常处理代码

实际场景

有一次项目上线后API调用经常失败,网络不稳定、服务器偶尔宕机、API限流,各种问题层出不穷。那时候没有完善的错误处理机制,每次失败都要手动重试,用户体验很差。

后来我想,为什么不能建立一个完善的错误重试和异常处理机制呢?于是用Trae生成了一个错误处理工具,现在不管遇到什么错误,都能自动重试、记录日志、发送告警,大大提高了系统的稳定性。

Trae提示词技巧

建立错误重试和异常处理机制,关键是要想清楚要处理哪些错误情况。我一开始也没头绪,后来慢慢摸索出一套方法。

优化前:

复制代码
帮我处理API错误

优化后:

复制代码
编写一个Python API错误重试与异常处理工具,要求:

1. 核心功能:
   - 支持多种错误类型处理
   - 支持指数退避重试策略
   - 支持最大重试次数限制
   - 支持错误日志记录
   - 支持错误告警通知

2. 错误处理:
   - 网络超时错误
   - HTTP错误(4xx, 5xx)
   - API限流错误(429)
   - 数据解析错误
   - 数据库连接错误

3. 重试策略:
   - 指数退避算法
   - 固定延迟重试
   - 随机延迟重试
   - 条件重试(根据错误类型)
   - 最大重试次数限制

4. 告警通知:
   - 邮件通知
   - 短信通知
   - 钉钉/企业微信通知
   - Slack通知
   - 自定义webhook通知

5. 代码要求:
   - 使用面向对象编程
   - 添加详细的中文注释和日志
   - 实现异常处理和错误恢复
   - 支持配置文件
   - 遵循PEP 8代码规范

6. 输出要求:
   - 生成可执行的处理脚本
   - 生成错误日志文件
   - 生成错误报告
   - 可选:发送告警通知

这样写就把错误处理的需求说清楚了,Trae生成的工具基本能直接用。

生成的代码

复制代码
import time
import logging
import smtplib
from email.mime.text import MIMEText
from typing import Dict, List, Optional, Callable, Any
from dataclasses import dataclass, field
from datetime import datetime
from functools import wraps


@dataclass
class RetryConfig:
    """重试配置"""
    max_retries: int = 3
    base_delay: float = 1.0
    max_delay: float = 60.0
    exponential_base: float = 2.0
    jitter: bool = True


@dataclass
class ErrorReport:
    """错误报告"""
    timestamp: str = field(default_factory=lambda: datetime.now().isoformat())
    error_type: str = ''
    error_message: str = ''
    retry_count: int = 0
    total_time: float = 0.0
    success: bool = False


class ErrorHandler:
    """错误处理器"""
    
    def __init__(self, config: Optional[Dict] = None):
        """初始化处理器"""
        self.config = config or {}
        self.logger = self._setup_logger()
        self.error_reports: List[ErrorReport] = []
        
        self.logger.info("错误处理器初始化完成")
    
    def _setup_logger(self) -> logging.Logger:
        """设置日志"""
        logger = logging.getLogger('ErrorHandler')
        logger.setLevel(logging.INFO)
        
        handler = logging.StreamHandler()
        formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        logger.addHandler(handler)
        
        return logger
    
    def retry_with_backoff(
        self,
        retry_config: Optional[RetryConfig] = None,
        on_retry: Optional[Callable] = None,
        on_success: Optional[Callable] = None,
        on_failure: Optional[Callable] = None
    ):
        """带退避的重试装饰器"""
        config = retry_config or RetryConfig()
        
        def decorator(func):
            @wraps(func)
            def wrapper(*args, **kwargs):
                last_exception = None
                total_time = 0.0
                
                for attempt in range(config.max_retries + 1):
                    try:
                        start_time = time.time()
                        result = func(*args, **kwargs)
                        elapsed_time = time.time() - start_time
                        total_time += elapsed_time
                        
                        # 成功
                        if on_success:
                            on_success(attempt, elapsed_time)
                        
                        self.logger.info(f"函数 {func.__name__} 执行成功 (尝试 {attempt + 1}/{config.max_retries + 1})")
                        
                        return result
                    
                    except Exception as e:
                        last_exception = e
                        elapsed_time = time.time() - start_time
                        total_time += elapsed_time
                        
                        # 记录错误
                        self.logger.warning(
                            f"函数 {func.__name__} 执行失败 (尝试 {attempt + 1}/{config.max_retries + 1}): {str(e)}"
                        )
                        
                        # 调用重试回调
                        if on_retry:
                            on_retry(attempt, e)
                        
                        # 如果是最后一次尝试,抛出异常
                        if attempt == config.max_retries:
                            if on_failure:
                                on_failure(attempt, e)
                            
                            error_report = ErrorReport(
                                error_type=type(e).__name__,
                                error_message=str(e),
                                retry_count=attempt,
                                total_time=total_time,
                                success=False
                            )
                            self.error_reports.append(error_report)
                            
                            raise e
                        
                        # 计算延迟时间
                        delay = min(
                            config.base_delay * (config.exponential_base ** attempt),
                            config.max_delay
                        )
                        
                        # 添加随机抖动
                        if config.jitter:
                            import random
                            delay = delay * (0.5 + random.random())
                        
                        self.logger.info(f"{delay:.2f}秒后重试...")
                        time.sleep(delay)
                
                # 理论上不会执行到这里
                raise last_exception
            
            return wrapper
        return decorator
    
    def send_email_alert(
        self,
        subject: str,
        message: str,
        to_emails: List[str],
        smtp_config: Optional[Dict] = None
    ):
        """发送邮件告警"""
        try:
            config = smtp_config or self.config.get('smtp', {})
            
            msg = MIMEText(message, 'plain', 'utf-8')
            msg['Subject'] = subject
            msg['From'] = config.get('from', '')
            msg['To'] = ', '.join(to_emails)
            
            with smtplib.SMTP(
                host=config.get('host', 'smtp.gmail.com'),
                port=config.get('port', 587)
            ) as server:
                server.starttls()
                server.login(
                    config.get('username', ''),
                    config.get('password', '')
                )
                server.send_message(msg)
            
            self.logger.info(f"邮件告警已发送: {subject}")
        
        except Exception as e:
            self.logger.error(f"发送邮件告警失败: {str(e)}")
            raise
    
    def generate_error_report(self, output_path: str):
        """生成错误报告"""
        try:
            import json
            
            report = {
                'timestamp': datetime.now().isoformat(),
                'total_errors': len(self.error_reports),
                'errors': [
                    {
                        'timestamp': error.timestamp,
                        'error_type': error.error_type,
                        'error_message': error.error_message,
                        'retry_count': error.retry_count,
                        'total_time': error.total_time,
                        'success': error.success
                    }
                    for error in self.error_reports
                ]
            }
            
            with open(output_path, 'w', encoding='utf-8') as f:
                json.dump(report, f, indent=2, ensure_ascii=False)
            
            self.logger.info(f"错误报告已生成: {output_path}")
        
        except Exception as e:
            self.logger.error(f"生成错误报告失败: {str(e)}")
            raise


def main():
    """主函数"""
    handler = ErrorHandler()
    
    # 示例:使用重试装饰器
    @handler.retry_with_backoff(
        retry_config=RetryConfig(max_retries=3, base_delay=1.0),
        on_retry=lambda attempt, error: print(f"重试 {attempt + 1}: {error}"),
        on_success=lambda attempt, elapsed: print(f"成功! 耗时: {elapsed:.2f}秒"),
        on_failure=lambda attempt, error: print(f"失败! {error}")
    )
    def unreliable_function():
        """模拟不稳定的函数"""
        import random
        if random.random() < 0.7:
            raise Exception("随机错误")
        return "成功"
    
    # 调用函数
    try:
        result = unreliable_function()
        print(f"结果: {result}")
    except Exception as e:
        print(f"最终失败: {e}")
        
        # 发送告警
        handler.send_email_alert(
            subject="API调用失败告警",
            message=f"函数执行失败: {str(e)}",
            to_emails=["admin@example.com"]
        )
        
        # 生成错误报告
        handler.generate_error_report('error_report.json')


if __name__ == '__main__':
    main()

使用说明

这套错误重试和异常处理工具用起来挺方便的,我一般按这几个步骤来:

  1. 安装依赖

    不需要额外依赖,使用Python标准库

  2. 配置重试策略

    retry_config = RetryConfig(
    max_retries=3,
    base_delay=1.0,
    max_delay=60.0,
    exponential_base=2.0,
    jitter=True
    )

  3. 使用重试装饰器

    handler = ErrorHandler()

    @handler.retry_with_backoff(retry_config=retry_config)
    def api_call():
    # API调用逻辑
    pass

    调用函数

    result = api_call()

效果对比

用这套错误重试和异常处理工具后,系统稳定性提升了不少:

  • 以前手动处理错误,要花2-3小时,还容易遗漏
  • 现在用Trae生成处理工具,10分钟就能搞定(包括写提示词)
  • 运行处理只要几分钟,而且不会遗漏

算下来效率提升了10-20倍,而且系统稳定性也提高了不少。

总结

通过这3个技巧,我用Trae成功构建了Python API自动化系统:

  1. 批量调用API:支持并发控制、请求重试、速率限制、数据缓存
  2. 数据自动解析与存储:支持多种数据格式、字段映射、数据验证、批量存储
  3. 错误重试与异常处理:支持指数退避、错误日志、告警通知、错误报告

整个API自动化流程从2-3小时缩短到几分钟,效率提升了10倍以上。现在可以轻松处理各种API调用、数据解析和错误处理,大大提高了开发效率。

如果你也想提升API开发效率,不妨试试用Trae构建Python API自动化系统,相信会有意想不到的收获!

📚Python Trae提示词开发实战系列目录

  1. 【第1篇】2026最新 3个技巧让代码生成质量提升10倍

  2. 【第2篇】2026 最新 10个自动化批处理场景 + 完整代码

  3. 【第3篇】2026 最新 用模块化提示词生成可运行电商系统代码

  4. 【第4篇】2026 最新 用Pandas Excel打造企业级自动化报表让效率提升10倍

  5. 【第5篇】2026 最新 用提示词优化技巧生成爬虫代码

  6. 【第6篇】2026 最新 生成完整的自动化测试框架效率提升10倍

  7. 【第7篇】2026 最新 如何提高AI代码生成质量让效率提升10倍

  8. 【第8篇】2026 最新 数据采集与清洗一体化方案让效率提升10倍

  9. 【第9篇】2026 最新 快速定位和解决代码生成问题让效率提升10倍

10.【第10篇】2026 最新 从日志中挖掘有价值信息让效率提升10倍

11.【第11篇】2026 最新 AI辅助代码审查让效率提升10倍

👉 最新发布点击关注 解锁更多深度干货!

💡 如果你觉得有收获,欢迎点个【赞】或【收藏】💡

相关推荐
InfiSight智睿视界15 小时前
门店智能体技术如何破解美容美发连锁的“标准执行困境”
大数据·运维·人工智能
Corleo15 小时前
记录一次复杂的 ONNX 到 TensorRT 动态 Shape 转换排错过程
python·ai
Toky丶15 小时前
【文献阅读】BitNet Distillation
人工智能
LaughingZhu15 小时前
Product Hunt 每日热榜 | 2026-01-09
人工智能·经验分享·神经网络·搜索引擎·产品运营
shughui15 小时前
Python基础面试题:语言定位+数据类型+核心操作+算法实战(含代码实例)
开发语言·python·算法
莫非王土也非王臣15 小时前
卷积神经网络与应用
人工智能·神经网络·cnn
Yeats_Liao16 小时前
MindSpore开发之路(二十五):融入开源:如何为MindSpore社区贡献力量
人工智能·分布式·深度学习·机器学习·华为·开源
Hi2024021716 小时前
如何通过选择正确的畸变模型解决相机标定难题
人工智能·数码相机·计算机视觉·自动驾驶
No0d1es16 小时前
2025年12月电子学会青少年软件编程Python六级等级考试真题试卷
开发语言·python·青少年编程·等级考试·电子学会
Blossom.11816 小时前
Transformer架构优化实战:从MHA到MQA/GQA的显存革命
人工智能·python·深度学习·react.js·架构·aigc·transformer