From 258f06770c5f2047b8799bede4fa0fab4a28dfc5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=A5=BF=E7=93=9C=C2=B0?= Date: Mon, 8 Jun 2026 14:48:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E8=81=8C=E4=B8=9A?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/core/Exceptions.py | 48 +++++++++++-------- backend/api/utils/skill_detail.py | 3 +- backend/core/basic/character/calc_carry.py | 20 +++++++- .../character/GF/mage_female/elementalist.py | 8 ++-- .../GF/priest_male/crusader_male_carry.py | 4 +- backend/core/character/GF/thief/rogue.py | 4 +- 6 files changed, 57 insertions(+), 30 deletions(-) diff --git a/backend/api/core/Exceptions.py b/backend/api/core/Exceptions.py index 26b3a8dd..a13b36a6 100644 --- a/backend/api/core/Exceptions.py +++ b/backend/api/core/Exceptions.py @@ -7,7 +7,7 @@ from fastapi.responses import JSONResponse from api.core.exception import ResponseException -logFormatter = logging.Formatter( +logFormatter = logging.Formatter( """ [start] %(asctime)s @@ -15,19 +15,24 @@ logFormatter = logging.Formatter( %(message)s [end] """ -) - - -async def all_exception_handler(request: Request, ex: Exception): - # api = str(request.url).split("api/")[1] - info = '' - if not isinstance(ex, ResponseException): - info = traceback.format_exc(limit=-1).strip().split('\n')[1:] - info[0] = info[0].split('\\')[-1].replace('"', ':').replace(',', '') - info = '\r'.join(info) - if request.client.host != '127.0.0.1': - from fastapi.logger import logger - logger.setLevel(logging.ERROR) +) + + +def format_exception() -> str: + lines = traceback.format_exc().strip().splitlines() + if lines and lines[0].startswith('Traceback '): + lines = lines[1:] + return '\r'.join(lines) + + +async def all_exception_handler(request: Request, ex: Exception): + # api = str(request.url).split("api/")[1] + info = '' + if not isinstance(ex, ResponseException): + info = format_exception() + if request.client.host != '127.0.0.1': + from fastapi.logger import logger + logger.setLevel(logging.ERROR) logger.name = 'dcalc' log_directory = 'logs' import os @@ -42,12 +47,15 @@ async def all_exception_handler(request: Request, ex: Exception): try: import pathlib pathlib.Path(log_directory).mkdir(parents=True, exist_ok=True) - except PermissionError: - print('创建日志目录logs失败,请确认是否限制了基础的运行权限') - logFunc = logger.error - logFunc(info) - info = '服务器内部错误' - fileHandler.close() + except PermissionError: + print('创建日志目录logs失败,请确认是否限制了基础的运行权限') + logFunc = logger.error + try: + logFunc(info) + info = '服务器内部错误' + finally: + logger.removeHandler(fileHandler) + fileHandler.close() else: info = ex.args[0] # traceback.print_last(sys.exc_info()) diff --git a/backend/api/utils/skill_detail.py b/backend/api/utils/skill_detail.py index f32ff9d3..630184ed 100644 --- a/backend/api/utils/skill_detail.py +++ b/backend/api/utils/skill_detail.py @@ -60,7 +60,8 @@ def skill_detail_for_level(skill_data: dict[str, Any], level: int | None) -> dic return result attribute = {**level_info, **detail} - attribute['detail'] = attribute.get('optionDesc', '') + option_desc = attribute.get('optionDesc') + attribute['detail'] = option_desc if isinstance(option_desc, str) else '' for key, value in (attribute.get('optionValue') or {}).items(): attribute['detail'] = attribute['detail'].replace(f'{{{key}}}', str(value)) diff --git a/backend/core/basic/character/calc_carry.py b/backend/core/basic/character/calc_carry.py index 956d41d5..6a72509a 100644 --- a/backend/core/basic/character/calc_carry.py +++ b/backend/core/basic/character/calc_carry.py @@ -1,8 +1,23 @@ +import inspect + from ..formula import 获取基础属性 from core.basic.property import CharacterInfo from .base import CharacterBase +def _skill_error_context(char: CharacterBase, skill, mode: str) -> str: + skill_class = skill.__class__ + skill_file = inspect.getsourcefile(skill_class) or inspect.getfile(skill_class) + return ( + f'角色={getattr(char, "角色", "")}, ' + f'职业={getattr(char, "职业", "")}, ' + f'技能={getattr(skill, "name", "")}, ' + f'技能类={skill_class.__name__}, ' + f'mode={mode}, ' + f'文件={skill_file}' + ) + + class CalcCarryMixin(CharacterBase): """输出角色技能伤害计算相关方法""" @@ -51,7 +66,10 @@ class CalcCarryMixin(CharacterBase): for i in self.skills: if i.damage and i.lv > 0: for mode in i.mode: - temp = i.skillInfo(mode) + try: + temp = i.skillInfo(mode) + except Exception as ex: + raise RuntimeError(f'职业技能计算失败: {_skill_error_context(self, i, mode)}') from ex if temp[0] > 0: skillInfos.append( { diff --git a/backend/core/character/GF/mage_female/elementalist.py b/backend/core/character/GF/mage_female/elementalist.py index 0df33c64..0d0d5cb5 100644 --- a/backend/core/character/GF/mage_female/elementalist.py +++ b/backend/core/character/GF/mage_female/elementalist.py @@ -200,8 +200,8 @@ class Skill11(ActiveSkill): self._ratio = value # 技能等级变化的时候,系数对应的数值变化 - def update_skill_attribute(self,skill, type, old, new, data,ratio = 100,weapon = []): - super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon) + def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): + super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) # 虚无之球 보이드 @@ -300,8 +300,8 @@ class Skill16(PassiveSkill): self._ratio = value # 技能等级变化的时候,系数对应的数值变化 - def update_skill_attribute(self,skill, type, old, new, data,ratio = 100,weapon = []): - super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon) + def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): + super().update_skill_attribute(skill, type, old, new, data, ratio / self.ratio, weapon, weapon_type, weapon_options) # 天雷 썬더 콜링 # https://api.neople.co.kr/df/skills/3909d0b188e9c95311399f776e331da5/d2c6df5105577fb59fb92529a36165a0?apikey=fdvit1Kj64EAJm0qfB3JEAD8FLExLDD0 diff --git a/backend/core/character/GF/priest_male/crusader_male_carry.py b/backend/core/character/GF/priest_male/crusader_male_carry.py index 87291e70..e43d13a7 100644 --- a/backend/core/character/GF/priest_male/crusader_male_carry.py +++ b/backend/core/character/GF/priest_male/crusader_male_carry.py @@ -1677,7 +1677,7 @@ class Skill45(ActiveSkill): # 3层信仰效果时神圣之力持续时间 : {value6}秒 data6 = get_data(f'{prefix}/{uuid}', 6) - def skillInfo(self): + def skillInfo(self,mode=""): prep = self.char.BuffSkill.skillInfo() ratio = self.data2[self.lv] * 5 / 100 return prep[0] * ratio, [prep[1][0] * ratio, prep[1][1], prep[1][2] * ratio], [prep[2][0] * ratio, prep[2][1], prep[2][2] * ratio], 0, self.getSkillCD() @@ -1843,7 +1843,7 @@ class Skill49(ActiveSkill): # 力量、 智力增加 : [天启之光]数值的{value6}% data6 = get_data(f'{prefix}/{uuid}', 6) - def skillInfo(self): + def skillInfo(self,mode=""): """技能信息""" prep = self.char.AwakeSkill.skillInfo() ratio = 0 diff --git a/backend/core/character/GF/thief/rogue.py b/backend/core/character/GF/thief/rogue.py index a5af3fa7..4a616b1f 100644 --- a/backend/core/character/GF/thief/rogue.py +++ b/backend/core/character/GF/thief/rogue.py @@ -345,11 +345,11 @@ class Skill19(ActiveSkill): skill.endpower *= raito self._maxLayer = value - def update_skill_attribute(self, skill, type, old, new, data, ratio, weapon=[]): + def update_skill_attribute(self, skill, type, old, new, data, ratio=100, weapon=(), weapon_type=None, weapon_options=()): if len(data) == 0: data = getattr(self, f'data{int(self.maxLayer)}') data = [i - 100 if i > 100 else 0 for i in data] - super().update_skill_attribute(skill, type, old, new, data, ratio, weapon) + super().update_skill_attribute(skill, type, old, new, data, ratio, weapon, weapon_type, weapon_options) # 弧光连闪