121707-修复Matchexchange除零错误.md 3.2 KB

修复Matchexchange除零错误

任务时间

  • 开始时间:2025年06月12日 17:07:47 CST
  • 完成时间:2025年06月12日 17:10:00 CST

问题描述

在处理 request_1749718293522 请求时,app/Module/AppGame/Handler/Matchexchange/ListHandler.php 第65行发生除零错误:

[2025-06-12T17:05:58.489442+08:00] laravel.ERROR: Division by zero {"exception":"[object] (DivisionByZeroError(code: 0): Division by zero at /var/www/html/app/Module/AppGame/Handler/Matchexchange/ListHandler.php:65)"}

问题分析

  1. 错误位置ListHandler.php 第65行 $lastPage = ceil(($result['total'] ?? 0) / $pageSize);
  2. 根本原因:客户端请求中的 page.per_page 字段未设置,导致默认值为0
  3. 请求数据

    {
     "requestUnid": "request_1749718293522",
     "matchexchangeList": {
       "itemId": "3",
       "page": {
         "page": "1"
       }
     }
    }
    

    注意:page 对象中只有 page 字段,缺少 per_page 字段

修复方案

在处理分页参数时增加有效性检查,确保 $pageSize 不为0:

修改前代码

// 解析分页参数
$pageNum  = $page ? $page->getPage() : 1;
$pageSize = $page ? $page->getPerPage() : 20;

// 限制分页大小
$pageSize = min($pageSize, 100);
$pageNum  = max($pageNum, 1);

修改后代码

// 解析分页参数
$pageNum  = $page ? $page->getPage() : 1;
$pageSize = $page ? $page->getPerPage() : 20;

// 确保分页参数有效,防止除零错误
$pageSize = $pageSize > 0 ? $pageSize : 20;
$pageNum  = $pageNum > 0 ? $pageNum : 1;

// 限制分页大小
$pageSize = min($pageSize, 100);
$pageNum  = max($pageNum, 1);

修复验证

使用重放命令验证修复效果:

php artisan debug:reproduce-error request_1749718293522

修复前结果

  • 状态码:500
  • 错误:Division by zero

修复后结果

  • 状态码:200
  • 响应正常:

    {
    "runUnid": "684a994dea0b9",
    "runMs": "234",
    "code": "OK",
    "callpath": "Matchexchange-List",
    "lastData": [],
    "matchexchangeList": {
      "page": {
        "currentPage": "1",
        "perPage": "20"
      },
      "price": {
        "itemId": "3",
        "minPrice": 10.5,
        "maxPrice": 25.8
      }
    }
    }
    

技术细节

  1. Protobuf默认值:根据 protophp/Uraus/Kku/Common/RequestPage.phpper_page 字段的默认值为0
  2. 防御性编程:在进行除法运算前,必须检查除数是否为0
  3. 业务逻辑:当 per_page 为0或负数时,使用默认值20

提交信息

修复Matchexchange ListHandler除零错误

- 问题:当客户端请求中page.per_page字段未设置时,默认值为0导致除零错误
- 修复:在处理分页参数时增加有效性检查,确保pageSize不为0
- 测试:使用php artisan debug:reproduce-error验证修复有效

影响范围

  • 修改文件:app/Module/AppGame/Handler/Matchexchange/ListHandler.php
  • 影响功能:交易大厅成交列表查询
  • 风险评估:低风险,仅增加参数有效性检查

总结

通过增加分页参数的有效性检查,成功修复了除零错误。这是一个典型的防御性编程实践,确保在处理外部输入时进行必要的验证。