27日1100-Handler修复.md 5.1 KB

Handler修复

任务概述

修复Handler中的多个问题,包括LastData处理、try-catch块使用、ValidateException处理和灾害状态更新错误。

问题分析

1. LastData处理问题

  • FertilizerHandler在事务内部手动设置LastData,违反了设计原则
  • AppGameProtobufResponseListener已经统一处理LastData,Handler不应该重复处理
  • Shop/BuyHandler、God/OpenHandler、Pet/GetHandler等也存在类似问题

2. try-catch块包含验证部分

  • FertilizerHandler的try块包含了验证逻辑,应该将验证移到try块外
  • 其他Handler如PesticideHandler、WateringHandler等已经正确实现了这个模式

3. 对ValidateException的错误处理

  • 多个Handler对ValidateException进行catch,应该让ValidateException交由框架处理
  • 涉及的Handler:FertilizerHandler、WeedicideHandler、WateringHandler、God/OpenHandler、Pet/GetHandler、Pet/LifeSkillUseHandler

4. 灾害状态更新错误

  • GenerateDisasterListener中试图访问int类型的value属性,导致"Attempt to read property \"value\" on int"错误
  • CropGrowthStageChangedEvent中oldStage和newStage是int类型,不是枚举对象

修复内容

1. FertilizerHandler修复

  • 移除Handler中处理LastData的代码(第95-105行)
  • 将验证逻辑移到try块外(第64-65行)
  • 不catch ValidateException,只catch LogicException和Exception
  • 按照PesticideHandler模式重构

2. Shop/BuyHandler修复

  • 移除手动设置LastData的代码(第102-116行)
  • 移除不再使用的import(DataItem、LastData)
  • 购买商品会触发物品变更事件,AppGameProtobufResponseListener会自动处理LastData

3. God/OpenHandler修复

  • 移除设置LastData的代码(第74-77行)
  • 修复activateGodBuff方法,移除LastData处理(第191-213行)
  • 移除对ValidateException的catch(第72-83行)
  • 移除不再使用的import(DataGod、LastData)

4. Pet/GetHandler修复

  • 移除设置LastData的代码(第69-72行)
  • 移除对ValidateException的catch(第74-84行)
  • 修复createPetFromItem方法,移除LastData处理(第168-203行)

5. Pet/LifeSkillUseHandler修复

  • 移除对ValidateException的catch(第136-148行)
  • 虽然之前重新抛出了异常,但根据任务要求应该完全不catch

6. WeedicideHandler修复

  • 移除对ValidateException的catch(第75-86行)

7. WateringHandler修复

  • 移除对ValidateException的catch(第75-86行)

8. GenerateDisasterListener修复

  • 修复第38、39、48、49行,移除对value属性的访问
  • 修复第30行的条件判断,使用枚举的value属性进行比较
  • 因为CropGrowthStageChangedEvent中的oldStage和newStage是int类型,不需要访问value属性

9. CropGrowthStageChangedListener修复(关键修复)

  • 修复错误的存储方式:之前直接使用Cache和LandStatusTempDto存储数据
  • 改为使用LandTemp::handleLandStatusChanged()统一存储方法
  • 创建LandStatusChangedEvent并通过LandTemp处理,确保存储格式一致
  • 这是导致"施肥后LastData中只有物品,没有土地"问题的根本原因

10. RemoveCropHandler和CropLogic修复(铲除作物LastData问题)

  • 修复CropLogic::removeCrop方法:添加土地状态变更事件触发
  • 修改CropService::removeCrop返回格式:包含状态变更信息
  • 修复RemoveCropHandler:在事务提交后触发土地状态变更事件
  • 移除Logic层的事务管理,统一由Handler管理事务
  • 这是导致"铲除作物LastData缺少土地数据"问题的根本原因

修复原则

1. LastData处理原则

  • 除了User/DataHandler(强制同步)外,其他Handler都不应该处理LastData
  • AppGameProtobufResponseListener统一处理LastData
  • 查询类Handler(如Item/QueryHandler、Shop/QueryHandler)可以设置LastData返回查询结果

2. 验证处理原则

  • 验证逻辑应该在try块外执行
  • 不应该catch ValidateException,让框架处理
  • 只catch LogicException和Exception进行业务逻辑和系统错误处理

3. 事务处理原则

  • 验证通过后再开启事务
  • 在catch块中检查事务级别并回滚
  • 事务外执行不影响数据一致性的操作(如更新作物生长阶段)

测试验证

修复后的代码已提交并推送到远程仓库,需要进行以下测试:

  1. 施肥操作测试 - 验证LastData是否正确返回土地信息
  2. 购买商品测试 - 验证物品变更是否正确反映在LastData中
  3. 神像激活测试 - 验证神像状态变更是否正确处理
  4. 宠物获取测试 - 验证宠物创建是否正确处理
  5. 灾害生成测试 - 验证作物生长阶段变更时灾害状态更新是否正常

影响范围

  • AppGame模块的所有相关Handler
  • Farm模块的灾害监听器
  • 前端LastData数据同步机制

提交信息

修复Handler中的问题:移除LastData处理、修复try-catch块、移除ValidateException捕获、修复灾害状态更新错误
修复土地暂存数据存储方式:使用LandTemp统一存储方法而非直接操作Cache
修复铲除作物LastData缺少土地数据问题:添加土地状态变更事件触发

完成时间

2025-05-27 11:45(包含铲除作物修复)