当前位置:首页>python>Python报错居然是好事?80%的人不知道的隐藏福利

Python报错居然是好事?80%的人不知道的隐藏福利

  • 2026-07-01 05:26:12
Python报错居然是好事?80%的人不知道的隐藏福利

每次报错都在帮你排雷
真正拉开差距的,是会不会利用异常


你有过这种经历吗

代码写完,一运行——报错了

然后你的第一反应是什么

是不是赶紧百度/Google/ChatGPT,复制错误信息,找到解决方案,复制粘贴,改完再跑
如果跑通了,长舒一口气,关掉窗口,仿佛刚才什么都没发生

如果这是你的日常,那我要告诉你一个残忍的事实:

你正在完美地错过一个让自己代码能力翻倍的机会

报错不是敌人,是还没开刃的刀


你是不是也这样?

让我猜猜,你肯定遇到过以下场景:

✅ 写着写着突然报错,看不懂英文提示,直接心态炸裂

✅ 百度半天找到一个解决方案,结果改完这里,那里又崩了

✅ 每次调试都像在拆炸弹,不知道哪里会爆

✅ 学了好几个月Python,遇到报错还是慌得一批,不知道从哪着手

✅ 复制粘贴一堆try-except,最后except里就一行pass,假装问题不存在

如果是,这文章就是为你写的

你可能觉得,报错嘛,绕过去就行了

但我告诉你,绕得了一次,绕不了一辈子

真正拉开差距的,不是谁写的代码不报错,而是谁能在报错发生时,快速定位问题、理解本质、然后一次性解决

而这个能力,90%的Python初学者从头到尾都没人教

今天,我来教


认知反转:报错是你最好的老师

先问你一个问题:

**你的代码能力,是怎么提升的
**

是看书看视频刷教程
还是疯狂写代码

告诉你,都不是

**你代码能力的提升,80%来自解决错误和异常
**

为什么

因为看书的时候,你面对的是"理想情况"——作者已经帮你排除了所有干扰,代码跑起来永远是顺的
但 реальный开发中,你面对的是"现实情况"——数据会出错、网络会超时、用户会输入奇怪的东西、边界情况会把你心态搞崩

那些让你心态炸裂的报错,其实是在帮你排雷

你在公司里写代码,产品上线后用户报bug,你能不能快速定位、快速修复——这才是你价值的体现

而报错,就是最真实的练习场景

**每一次你选择绕过异常,而不是理解异常,你都错过了一次让自己变强的机会
**

反过来,每一次你认真分析报错、顺着traceback找到根因、自己写出解决方案——你的debug能力就在悄悄涨

所以我今天要告诉你的是:

报错不是你的敌人,是还没付费的教练

异常处理不是用来隐藏问题的,是用来解决问题

这,就是我要教你的利用异常而不是逃避异常的方法


技术详解:如何把报错,变成你的武器

接下来上强度

我要给你3个实战场景,每个场景都有完整可运行的代码,有逐行解释,有运行结果

学完这些,下次遇到报错,你不会再慌

场景一:文件操作——优雅地处理"文件不存在"

你遇到过的报错:

FileNotFoundError: [Errno 2] No such file or directory: 'data.txt'

大多数人的做法:

# 假装问题不存在
try:
withopen('data.txt''r'as f:
        data = f.read()
except:
    data = ''# 干脆返回空

这种写法,问题在哪里你都不知道——是文件不存在
是权限问题
是路径错误
一概不知

**正确做法:分情况处理,每种错误单独捕获,给用户明确的提示
**

import os

defread_config_file(filename):
"""
    读取配置文件,处理各种可能的错误情况
    """

# 先检查文件是否存在
ifnot os.path.exists(filename):
# 给出明确提示,而不是让它悄悄失败
print(f"⚠️ 配置文件 {filename} 不存在,即将创建默认配置...")
return create_default_config(filename)

# 再检查是否有读取权限
ifnot os.access(filename, os.R_OK):
print(f"⚠️ 没有读取 {filename} 的权限,请检查文件权限设置")
returnNone

# 尝试读取文件
try:
withopen(filename, 'r', encoding='utf-8'as f:
            content = f.read()
print(f"✅ 成功读取配置文件,共 {len(content)} 个字符")
return content
except UnicodeDecodeError:
# 编码问题,换个编码试试
print(f"⚠️ UTF-8编码失败,尝试使用GBK编码...")
withopen(filename, 'r', encoding='gbk'as f:
return f.read()
except Exception as e:
# 其他未知错误,记录下来但不让程序崩溃
print(f"❌ 读取配置文件失败: {e}")
returnNone


defcreate_default_config(filename):
"""创建默认配置文件"""
    default_content = "# 默认配置\ndebug=True\n"
try:
withopen(filename, 'w', encoding='utf-8'as f:
            f.write(default_content)
print(f"✅ 已创建默认配置文件: {filename}")
return default_content
except Exception as e:
print(f"❌ 创建默认配置失败: {e}")
returnNone


# 测试运行
if __name__ == "__main__":
# 场景1:文件不存在
print("=" * 40)
print("测试1:读取不存在的文件")
    result = read_config_file("config.txt")

代码逐行解释:

# 第1行:导入os模块,用于文件检查
import os

# 第3-5行:函数文档字符串,说明函数功能
def read_config_file(filename):
    """
    读取配置文件,处理各种可能的错误情况
    """

# 第8-10行:先检查文件是否存在,这不是异常处理,而是预防
if not os.path.exists(filename):
    # 第9-12行:文件不存在时,给出明确提示并创建默认配置
    print(f"⚠️ 配置文件 {filename} 不存在,即将创建默认配置...")
    return create_default_config(filename)

# 第14-16行:检查文件是否可读
if not os.access(filename, os.R_OK):
    print(f"⚠️ 没有读取 {filename} 的权限,请检查文件权限设置")
    return None

# 第18-28行:尝试读取文件
try:
    # 正常的文件读取逻辑
    with open(filename, 'r', encoding='utf-8') as f:
        content = f.read()
        print(f"✅ 成功读取配置文件,共 {len(content)} 个字符")
        return content

# 第29-32行:处理编码错误,尝试换编码
except UnicodeDecodeError:
    print(f"⚠️ UTF-8编码失败,尝试使用GBK编码...")
    with open(filename, 'r', encoding='gbk') as f:
        return f.read()

# 第33-36行:兜底处理,记录未知错误但不让程序崩溃
except Exception as e:
    print(f"❌ 读取配置文件失败: {e}")
    return None


# 第39-47行:创建默认配置的函数
def create_default_config(filename):
    """创建默认配置文件"""
    default_content = "# 默认配置\ndebug=True\n"
    try:
        with open(filename, 'w', encoding='utf-8') as f:
            f.write(default_content)
        print(f"✅ 已创建默认配置文件: {filename}")
        return default_content
    except Exception as e:
        print(f"❌ 创建默认配置失败: {e}")
        return None


# 第50-56行:测试代码
if __name__ == "__main__":
    # 场景1:文件不存在
    print("=" * 40)
    print("测试1:读取不存在的文件")
    result = read_config_file("config.txt")

运行输出:

========================================
测试1:读取不存在的文件
⚠️ 配置文件 config.txt 不存在,即将创建默认配置...
✅ 已创建默认配置文件: config.txt

这个方案的核心原理:

  1. 1. 预防优于处理:先检查文件是否存在,而不是等报错了再处理
  2. 2. 分层捕获:把不同类型的错误分开处理,而不是用一个except通吃
  3. 3. 明确反馈:给用户/server明确的提示,而不是返回None然后让问题隐藏
  4. 4. 有回退方案:文件不存在就创建默认的,而不是直接报错退出

下次你在代码里看到FileNotFoundError,别急着百度,先想想要不要这么处理


场景二:网络请求——超时/断网/服务器错误,一个都别想逃掉

你遇到过的报错:

requests.exceptions.ConnectionError
requests.exceptions.Timeout
urllib.error.URLError

大多数人的做法:

import requests

# 不设置超时,程序能卡到天荒地老
response = requests.get('https://api.example.com/data')

或者:

import requests

try:
    response = requests.get('https://api.example.com/data')
except:
# 万能except,捕获所有异常然后装着没发生
print("请求失败了")

这种写法,问题在于:

  • • 不设超时?网络不通的时候程序就卡死
  • • 万能except?你根本不知道是网络断了还是服务器挂了还是超时了
  • • 返回None?调用方根本不知道为什么会拿到空数据

**正确做法:超时、连接错误、HTTP错误分开处理,给重试机会
**

import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import time


defrobust_request(url, method='GET', max_retries=3, timeout=10):
"""
    发送 HTTP 请求,带重试机制和超时处理

    参数:
        url: 请求URL
        method: 请求方法 GET/POST
        max_retries: 最大重试次数
        timeout: 超时时间(秒)
    """


# 配置重试策略:遇到这些情况会自动重试
    retry_strategy = Retry(
        total=max_retries,           # 总重试次数
        backoff_factor=1,            # 重试间隔递增因子
        status_forcelist=[429500502503504],  # 这些状态码会重试
        allowed_methods=["GET""POST""PUT""DELETE"]
    )

# 创建一个支持重试的session
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session = requests.Session()
    session.mount("http://", adapter)
    session.mount("https://", adapter)

# 开始请求
    start_time = time.time()
print(f"🔄 正在请求: {url}")

try:
# 设置timeout,避免无限等待
if method == 'GET':
            response = session.get(url, timeout=timeout)
elif method == 'POST':
            response = session.post(url, timeout=timeout)
else:
            response = session.request(method, url, timeout=timeout)

# 检查HTTP状态码
        response.raise_for_status()  # 如果状态码是4xx/5xx,会抛出异常

        elapsed = time.time() - start_time
print(f"✅ 请求成功! 状态码: {response.status_code}, 耗时: {elapsed:.2f}秒")
return response

# 处理连接错误( DNS解析失败、连接被拒绝等)
except requests.exceptions.ConnectionError as e:
print(f"❌ 连接失败: 网络问题或服务器不可达 - {e}")
# 给出明确的方向,而不是让你去百度
print("💡 排查方向: 检查网络、服务器地址、是否需要代理")
returnNone

# 处理超时错误
except requests.exceptions.Timeout as e:
print(f"❌ 请求超时: 超过{timeout}秒未收到响应 - {e}")
print("💡 排查方向: 网络慢、服务器负载高、尝试增加timeout")
returnNone

# 处理HTTP错误(4xx客户端错误、5xx服务器错误)
except requests.exceptions.HTTPError as e:
        status_code = e.response.status_code
print(f"❌ HTTP错误: 状态码 {status_code}")

if status_code == 401:
print("💡 排查方向: 需要认证,检查API密钥或Token")
elif status_code == 403:
print("💡 排查方向: 权限不足,检查权限设置")
elif status_code == 404:
print("💡 排查方向: 资源不存在,检查URL路径")
elif status_code >= 500:
print("💡 排查方向: 服务器错误,稍后重试")

returnNone

# 处理其他未知错误
except requests.exceptions.RequestException as e:
print(f"❌ 请求异常: {type(e).__name__} - {e}")
returnNone


# 测试运行
if __name__ == "__main__":
# 场景1:正常请求(替换成真实可用的URL测试)
print("=" * 40)
print("测试1:正常请求")
    result = robust_request('https://httpbin.org/get')

# 场景2:不存在的URL
print("=" * 40)
print("测试2:不存在的URL")
    result = robust_request('https://httpbin.org/status/404')

# 场景3:超时请求
print("=" * 40)
print("测试3:超时请求")
    result = robust_request('https://httpbin.org/delay/15', timeout=5)

代码逐行解释:

# 第1-4行:导入必要的库
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
import time


# 第6-18行:核心函数,定义参数
def robust_request(url, method='GET', max_retries=3, timeout=10):
    """
    发送 HTTP 请求,带重试机制和超时处理

    参数:
        url: 请求URL
        method: 请求方法 GET/POST
        max_retries: 最大重试次数
        timeout: 超时时间(秒)
    """

    # 第21-29行:配置重试策略
    # 遇到这些HTTP状态码会自动重试,不需要你手动写循环
    retry_strategy = Retry(
        total=max_retries,           # 总重试次数
        backoff_factor=1,            # 重试间隔递增: 1s, 2s, 3s...
        status_forcelist=[429, 500, 502, 503, 504],  # 服务器错误会重试
        allowed_methods=["GET", "POST", "PUT", "DELETE"]
    )

    # 第31-35行:创建session并挂载重试适配器
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session = requests.Session()
    session.mount("http://", adapter)
    session.mount("https://", adapter)

    # 第38-40行:记录开始时间,用于计算耗时
    start_time = time.time()
    print(f"🔄 正在请求: {url}")

    # 第42-56行:发起请求,设置timeout
    try:
        if method == 'GET':
            response = session.get(url, timeout=timeout)
        elif method == 'POST':
            response = session.post(url, timeout=timeout)
        else:
            response = session.request(method, url, timeout=timeout)

        # 第52行:检查HTTP状态码,4xx/5xx会抛异常
        response.raise_for_status()

        # 第54-55行:成功时给出清晰反馈
        elapsed = time.time() - start_time
        print(f"✅ 请求成功! 状态码: {response.status_code}, 耗时: {elapsed:.2f}秒")
        return response

    # 第58-62行:连接错误——网络不通或DNS解析失败
    except requests.exceptions.ConnectionError as e:
        print(f"❌ 连接失败: 网络问题或服务器不可达 - {e}")
        print("💡 排查方向: 检查网络、服务器地址、是否需要代理")
        return None

    # 第64-68行:超时错误
    except requests.exceptions.Timeout as e:
        print(f"❌ 请求超时: 超过{timeout}秒未收到响应 - {e}")
        print("💡 排查方向: 网络慢、服务器负载高、尝试增加timeout")
        return None

    # 第70-83行:HTTP错误——状态码4xx/5xx
    except requests.exceptions.HTTPError as e:
        status_code = e.response.status_code
        print(f"❌ HTTP错误: 状态码 {status_code}")

        # 给出具体的排查方向,而不是让你去百度
        if status_code == 401:
            print("💡 排查方向: 需要认证,检查API密钥或Token")
        elif status_code == 403:
            print("💡 排查方向: 权限不足,检查权限设置")
        elif status_code == 404:
            print("💡 排查方向: 资源不存在,检查URL路径")
        elif status_code >= 500:
            print("💡 排查方向: 服务器错误,稍后重试")

        return None

    # 第85-88行:兜底处理
    except requests.exceptions.RequestException as e:
        print(f"❌ 请求异常: {type(e).__name__} - {e}")
        return None

运行输出(示例):

========================================
测试1:正常请求
🔄 正在请求: https://httpbin.org/get
✅ 请求成功! 状态码: 200, 耗时: 0.58秒

========================================
测试2:不存在的URL
🔄 正在请求: https://httpbin.org/status/404
❌ HTTP错误: 状态码 404
💡 排查方向: 资源不存在,检查URL路径

========================================
测试3:超时请求
🔄 正在请求: https://httpbin.org/delay/15
❌ 请求超时: 超过5秒未收到响应 - HTTPConnectionPool(host='httpbin.org', port=443): Read timed out. (read timeout=5)
💡 排查方向: 网络慢、服务器负载高、尝试增加timeout

这个方案的核心理念:

  1. 1. 超时是必须的:永远不要让网络请求无限等待
  2. 2. 重试是自动的:用Retry策略自动处理临时性错误
  3. 3. 错误要分类:ConnectionError/Timeout/HTTPError分别处理
  4. 4. 给出方向:报错时告诉调用方接下来该查什么,而不是让它去 Google

这是你在公司里写爬虫/API调用时的必备姿势


场景三:自定义异常——让你的代码会"说话"

你遇到过的问题:

代码里充斥着这种判断:

defprocess_user_data(user):
if user isNone:
print("用户不存在")
return

if user.get('age'0) < 0:
print("年龄不能为负")
return

if user.get('balance'0) < 0:
print("余额不能为负")
return

# 业务逻辑...

这种写法问题在哪

  • • 错误信息不统一,这个print,那个return
  • • 调用方不知道具体哪个字段有问题
  • • 没有明确区分"业务错误"和"程序错误"

**正确做法:自定义异常,让业务逻辑的错误能够精确传播
**

# 定义业务异常类
classBusinessError(Exception):
"""业务错误基类"""
def__init__(self, message, error_code=None, field=None):
super().__init__(message)
self.message = message
self.error_code = error_code
self.field = field  # 哪个字段出问题

defto_dict(self):
"""转换为字典,方便API返回"""
return {
'error'self.__class__.__name__,
'message'self.message,
'error_code'self.error_code,
'field'self.field
        }


classUserNotFoundError(BusinessError):
"""用户不存在"""
def__init__(self, user_id):
super().__init__(
            message=f"用户ID {user_id} 不存在",
            error_code="USER_NOT_FOUND",
            field="user_id"
        )


classInvalidAgeError(BusinessError):
"""年龄无效"""
def__init__(self, age):
super().__init__(
            message=f"年龄必须大于0,当前值: {age}",
            error_code="INVALID_AGE",
            field="age"
        )


classInsufficientBalanceError(BusinessError):
"""余额不足"""
def__init__(self, required, actual):
super().__init__(
            message=f"余额不足,需要 {required},实际 {actual}",
            error_code="INSUFFICIENT_BALANCE",
            field="balance"
        )


# 业务逻辑层
classUserService:
"""用户服务"""

def__init__(self):
# 模拟数据库
self.users = {
1: {'id'1'name''张三''age'25'balance'1000},
2: {'id'2'name''李四''age': -1'balance'500},  # 错误数据
3: {'id'3'name''王五''age'30'balance'0},
        }

defget_user(self, user_id):
"""获取用户,如果不存在抛出明确的异常"""
        user = self.users.get(user_id)

if user isNone:
# 抛出自定义异常,而不是返回None
raise UserNotFoundError(user_id)

return user

defvalidate_user(self, user):
"""验证用户数据,如果有错误抛出明确的异常"""
        age = user.get('age')
if age isnotNoneand age <= 0:
raise InvalidAgeError(age)

# 可以继续验证其他字段...
returnTrue


classOrderService:
"""订单服务"""

def__init__(self):
self.user_service = UserService()

defcreate_order(self, user_id, amount):
"""
        创建订单

        参数:
            user_id: 用户ID
            amount: 订单金额
        """

# 1. 获取用户,如果用户不存在会抛出 UserNotFoundError
        user = self.user_service.get_user(user_id)

# 2. 验证用户数据,如果有错误会抛出 InvalidAgeError
self.user_service.validate_user(user)

# 3. 检查余额,如果不足会抛出 InsufficientBalanceError
if user['balance'] < amount:
raise InsufficientBalanceError(amount, user['balance'])

# 4. 创建订单
        order = {
'user_id': user_id,
'amount': amount,
'status''paid'
        }

# 5. 扣减余额
        user['balance'] -= amount

return order


# API层:统一处理异常
defhandle_request(func):
"""装饰器:统一处理业务异常"""
defwrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except BusinessError as e:
# 业务错误,返回结构化错误信息
return {'success'False'error': e.to_dict()}
except Exception as e:
# 未预期的程序错误,记录日志但不让用户看到详情
print(f"系统错误: {e}")
return {'success'False'error': {'message''系统异常,请稍后重试'}}

return wrapper


# 测试运行
@handle_request
defapi_create_order(user_id, amount):
"""API接口:创建订单"""
    service = OrderService()
    order = service.create_order(user_id, amount)
return {'success'True'data': order}


if __name__ == "__main__":
# 场景1:正常创建订单
print("=" * 40)
print("场景1:正常创建订单")
    result = api_create_order(user_id=1, amount=100)
print(f"结果: {result}")

# 场景2:用户不存在
print("=" * 40)
print("场景2:用户不存在")
    result = api_create_order(user_id=999, amount=100)
print(f"结果: {result}")

# 场景3:用户数据错误
print("=" * 40)
print("场景3:用户数据错误(年龄为负)")
    result = api_create_order(user_id=2, amount=100)
print(f"结果: {result}")

# 场景4:余额不足
print("=" * 40)
print("场景4:余额不足")
    result = api_create_order(user_id=3, amount=100)
print(f"结果: {result}")

代码逐行解释:

# 第1-15行:定义业务错误基类
class BusinessError(Exception):
    """业务错误基类"""
    def __init__(self, message, error_code=None, field=None):
        # 继承Exception,标准化错误处理
        super().__init__(message)
        self.message = message
        self.error_code = error_code      # 错误码,便于前端/客户端处理
        self.field = field                # 哪个字段出问题,精准定位

    def to_dict(self):
        """转换为字典,方便API返回JSON"""
        return {
            'error': self.__class__.__name__,  # 类名作为错误类型
            'message': self.message,
            'error_code': self.error_code,
            'field': self.field
        }


# 第17-24行:定义用户不存在错误
class UserNotFoundError(BusinessError):
    """用户不存在"""
    def __init__(self, user_id):
        super().__init__(
            message=f"用户ID {user_id} 不存在",
            error_code="USER_NOT_FOUND",
            field="user_id"
        )


# 第26-33行:定义年龄无效错误
class InvalidAgeError(BusinessError):
    """年龄无效"""
    def __init__(self, age):
        super().__init__(
            message=f"年龄必须大于0,当前值: {age}",
            error_code="INVALID_AGE",
            field="age"
        )


# 第35-42行:定义余额不足错误
class InsufficientBalanceError(BusinessError):
    """余额不足"""
    def __init__(self, required, actual):
        super().__init__(
            message=f"余额不足,需要 {required},实际 {actual}",
            error_code="INSUFFICIENT_BALANCE",
            field="balance"
        )


# 第45-58行:用户服务类
class UserService:
    """用户服务"""

    def __init__(self):
        # 模拟数据库,包含正常和异常数据
        self.users = {
            1: {'id': 1, 'name': '张三', 'age': 25, 'balance': 1000},
            2: {'id': 2, 'name': '李四', 'age': -1, 'balance': 500},  # 错误数据
            3: {'id': 3, 'name': '王五', 'age': 30, 'balance': 0},
        }

    def get_user(self, user_id):
        """获取用户,如果不存在抛出明确的异常"""
        user = self.users.get(user_id)

        if user is None:
            # 抛出自定义异常,带上user_id信息
            raise UserNotFoundError(user_id)

        return user

    def validate_user(self, user):
        """验证用户数据,如果有错误抛出明确的异常"""
        age = user.get('age')
        if age is not None and age <= 0:
            raise InvalidAgeError(age)

        return True


# 第61-87行:订单服务类
class OrderService:
    """订单服务"""

    def __init__(self):
        self.user_service = UserService()

    def create_order(self, user_id, amount):
        """
        创建订单

        核心:每一步都可能抛出异常,但异常会清晰传播
        """
        # 1. 获取用户,如果不存在会抛出 UserNotFoundError
        user = self.user_service.get_user(user_id)

        # 2. 验证用户数据,如果有错误会抛出 InvalidAgeError
        self.user_service.validate_user(user)

        # 3. 检查余额,如果不足会抛出 InsufficientBalanceError
        if user['balance'] < amount:
            raise InsufficientBalanceError(amount, user['balance'])

        # 4. 正常创建订单
        order = {
            'user_id': user_id,
            'amount': amount,
            'status': 'paid'
        }

        # 5. 扣减余额
        user['balance'] -= amount

        return order


# 第90-104行:API层装饰器,统一处理异常
def handle_request(func):
    """装饰器:统一处理业务异常"""
    def wrapper(*args, **kwargs):
        try:
            return func(*args, **kwargs)
        except BusinessError as e:
            # 业务错误,返回结构化JSON
            return {'success': False, 'error': e.to_dict()}
        except Exception as e:
            # 未预期的程序错误
            print(f"系统错误: {e}")
            return {'success': False, 'error': {'message': '系统异常,请稍后重试'}}

    return wrapper


# 第107-127行:测试代码
@handle_request
def api_create_order(user_id, amount):
    """API接口:创建订单"""
    service = OrderService()
    order = service.create_order(user_id, amount)
    return {'success': True, 'data': order}


if __name__ == "__main__":
    # 场景1:正常
    print("=" * 40)
    print("场景1:正常创建订单")
    result = api_create_order(user_id=1, amount=100)
    print(f"结果: {result}")

    # 场景2:用户不存在
    print("=" * 40)
    print("场景2:用户不存在")
    result = api_create_order(user_id=999, amount=100)
    print(f"结果: {result}")

    # 场景3:数据错误
    print("=" * 40)
    print("场景3:用户数据错误")
    result = api_create_order(user_id=2, amount=100)
    print(f"结果: {result}")

    # 场景4:余额不足
    print("=" * 40)
    print("场景4:余额不足")
    result = api_create_order(user_id=3, amount=100)
    print(f"结果: {result}")

运行输出:

========================================
场景1:正常创建订单
结果: {'success': True, 'data': {'user_id': 1, 'amount': 100, 'status': 'paid'}}

========================================
场景2:用户不存在
结果: {'success': False, 'error': {'error': 'UserNotFoundError', 'message': '用户ID 999 不存在', 'error_code': 'USER_NOT_FOUND', 'field': 'user_id'}}

========================================
场景3:用户数据错误
结果: {'success': False, 'error': {'error': 'InvalidAgeError', 'message': '年龄必须大于0,当前值: -1', 'error_code': 'INVALID_AGE', 'field': 'age'}}

========================================
场景4:余额不足
结果: {'success': False, 'error': {'error': 'InsufficientBalanceError', 'message': '余额不足,需要 100,实际 0', 'error_code': 'INSUFFICIENT_BALANCE', 'field': 'balance'}}

这个方案的核心理念:

  1. 1. 异常即业务逻辑:把业务规则违反视为"异常"而不是"返回False"
  2. 2. 异常带有上下文:哪个字段、什么值、错误码,一目了然
  3. 3. 异常自动传播:底层抛出,顶层捕获,中间层不需要判断返回值
  4. 4. API统一处理:用装饰器把所有业务异常转为结构化JSON

这套思想,是你在公司里写后端API的必备技能


技术总结:异常处理的三个境界

回顾一下,今天我给你讲了异常处理的三个层次:

境界
表现
特点
第1层
try-except包一切
能跑就行,分不清错误类型
第2层
分层捕获,给提示
能定位问题,给出排查方向
第3层
自定义异常,精准传播
业务逻辑清晰,API标准化

你现在在哪一层

不用急着跳到第三层,先把第二层玩明白


总结:3句话记住今天

  1. 1. 报错不是敌人,是还没付费的教练——每一次你认真分析报错,都是在练习debug能力
  2. 2. 分层捕获,给出方向——不要用一个except包所有,而是分别处理,给出下一步排查的提示
  3. 3. 预防优于处理——与其等报错再处理,不如先把"是否会出错"考虑进去

今天就可以开始做的3件事

  1. 1. 下次遇到报错,别急着百度,先读3遍traceback——它会告诉你哪里出错、怎么调用的
  2. 2. 给你现在的代码加timeout——特别是网络请求,加个timeout能救命
  3. 3. 今天把文章里的3段代码复制跑一遍——跑通了,你才真正学到

预告

下期我要教你:如何在报错时让ChatGPT帮你打工

怎么样让AI帮你定位问题,而不是给你一堆没用的解决方案

关注我,下期教你


*如果觉得有帮助,点个赞、转个发,让更多人被报错温柔以待
*

*我是小甲鱼,下次见
*

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-03 22:55:41 HTTP/2.0 GET : https://f.mffb.com.cn/a/489407.html
  2. 运行时间 : 0.324876s [ 吞吐率:3.08req/s ] 内存消耗:4,840.59kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c9ebfd2244d4c7973526a046a9971484
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001026s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001766s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.005789s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000913s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001988s ]
  6. SELECT * FROM `set` [ RunTime:0.000919s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002073s ]
  8. SELECT * FROM `article` WHERE `id` = 489407 LIMIT 1 [ RunTime:0.034844s ]
  9. UPDATE `article` SET `lasttime` = 1783090541 WHERE `id` = 489407 [ RunTime:0.025935s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.010597s ]
  11. SELECT * FROM `article` WHERE `id` < 489407 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001782s ]
  12. SELECT * FROM `article` WHERE `id` > 489407 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.002800s ]
  13. SELECT * FROM `article` WHERE `id` < 489407 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.069181s ]
  14. SELECT * FROM `article` WHERE `id` < 489407 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.025712s ]
  15. SELECT * FROM `article` WHERE `id` < 489407 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.014525s ]
0.326503s