From c20515971a68ca10afc2aef7aeab194b713a6701 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Wed, 2 Sep 2026 18:17:21 +0800 Subject: [PATCH] fix: restore multi-exception syntax --- app/agent/callback/__init__.py | 6 +++--- app/agent/middleware/skills.py | 2 +- app/agent/orchestrator.py | 10 +++++----- app/agent/policy/orchestrator.py | 2 +- app/agent/policy/sanitizer.py | 4 ++-- app/agent/runtime.py | 2 +- app/agent/skills/metadata.py | 2 +- app/agent/tools/manager.py | 4 ++-- app/api/endpoints/download.py | 2 +- app/application/messaging/agent.py | 2 +- app/application/subscription/priority.py | 18 +++++++++--------- app/application/system.py | 4 ++-- app/chain/search/pagination.py | 6 +++--- app/chain/search/provider.py | 2 +- app/chain/search/recommend.py | 2 +- app/chain/subscribe/completion.py | 2 +- app/chain/subscribe/refresh.py | 2 +- app/cli.py | 10 +++++----- app/scheduler/catalog.py | 2 +- app/scheduler/execution.py | 2 +- app/scheduler/progress.py | 4 ++-- app/scheduler/reconcile.py | 2 +- .../scripts/mp-downloader.py | 2 +- 23 files changed, 47 insertions(+), 47 deletions(-) diff --git a/app/agent/callback/__init__.py b/app/agent/callback/__init__.py index 11aa369d5..d4119dae0 100644 --- a/app/agent/callback/__init__.py +++ b/app/agent/callback/__init__.py @@ -267,7 +267,7 @@ class StreamingHandler: try: channel_enum = NotificationChannel(self._channel) self._max_message_length = ChannelCapabilityManager.get_max_message_length(channel_enum) - except ValueError, KeyError: + except (ValueError, KeyError): self._max_message_length = 0 # 启动异步定时刷新任务 @@ -567,7 +567,7 @@ class StreamingHandler: try: channel_enum = NotificationChannel(self._channel) return ChannelCapabilityManager.supports_capability(channel_enum, ChannelCapability.MESSAGE_EDITING) - except ValueError, KeyError: + except (ValueError, KeyError): return False def _get_rich_message(self, text: str) -> Optional[str]: @@ -707,7 +707,7 @@ class StreamingHandler: # 后续更新:编辑已有消息 try: channel_enum = NotificationChannel(self._channel) - except ValueError, KeyError: + except (ValueError, KeyError): return metadata = dict(self._message_response.metadata or {}) diff --git a/app/agent/middleware/skills.py b/app/agent/middleware/skills.py index c18ad7016..9a1907b0c 100644 --- a/app/agent/middleware/skills.py +++ b/app/agent/middleware/skills.py @@ -179,7 +179,7 @@ def _extract_version(skill_md: Path) -> int: return 0 try: return int(raw) - except ValueError, TypeError: + except (ValueError, TypeError): return 0 diff --git a/app/agent/orchestrator.py b/app/agent/orchestrator.py index 4bb0a6437..906d7cde6 100644 --- a/app/agent/orchestrator.py +++ b/app/agent/orchestrator.py @@ -489,7 +489,7 @@ class MoviePilotAgent: content = re.sub(r"\s*```$", "", content).strip() try: payload = json.loads(content) - except TypeError, ValueError: + except (TypeError, ValueError): return "" if not isinstance(payload, dict): return "" @@ -561,7 +561,7 @@ class MoviePilotAgent: return None try: return int(value) - except TypeError, ValueError: + except (TypeError, ValueError): return None @staticmethod @@ -576,7 +576,7 @@ class MoviePilotAgent: """读取 LangGraph 递归上限,防止模型持续循环调用工具。""" try: limit = int(get_runtime_setting("LLM_MAX_ITERATIONS") or 0) - except TypeError, ValueError: + except (TypeError, ValueError): limit = 0 return limit if limit > 0 else 128 @@ -1167,7 +1167,7 @@ class MoviePilotAgent: try: channel_enum = NotificationChannel(self.channel) return ChannelCapabilityManager.supports_capability(channel_enum, ChannelCapability.MESSAGE_EDITING) - except ValueError, KeyError: + except (ValueError, KeyError): return False @staticmethod @@ -1340,7 +1340,7 @@ class MoviePilotAgent: if body is not None: try: parts.append(json.dumps(body, ensure_ascii=False)) - except TypeError, ValueError: + except (TypeError, ValueError): parts.append(str(body)) return " ".join(part for part in parts if part) diff --git a/app/agent/policy/orchestrator.py b/app/agent/policy/orchestrator.py index cc4ed75ec..82793547a 100644 --- a/app/agent/policy/orchestrator.py +++ b/app/agent/policy/orchestrator.py @@ -60,7 +60,7 @@ def _normalize_policy_arguments(tool: Any, arguments: Mapping[str, Any]) -> dict try: validated = args_schema.model_validate(raw_arguments) return validated.model_dump(mode="json") - except AttributeError, TypeError, ValueError, ValidationError: + except (AttributeError, TypeError, ValueError, ValidationError): # 实际 handler 仍负责既有参数错误语义;策略观测按原始值保守处理。 return raw_arguments diff --git a/app/agent/policy/sanitizer.py b/app/agent/policy/sanitizer.py index 6bb16c909..31bd87958 100644 --- a/app/agent/policy/sanitizer.py +++ b/app/agent/policy/sanitizer.py @@ -528,7 +528,7 @@ def _redact_basic_auth( padded_token = token + "=" * (-len(token) % 4) try: decoded = base64.b64decode(padded_token, validate=True) - except binascii.Error, ValueError: + except (binascii.Error, ValueError): return match.group(0) if b":" not in decoded: return match.group(0) @@ -730,7 +730,7 @@ def sanitize_for_host( if not truncated and value.strip().startswith(("{", "[")): try: parsed = json.loads(value) - except TypeError, ValueError, json.JSONDecodeError: + except (TypeError, ValueError, json.JSONDecodeError): pass else: sanitized_json = sanitize_for_host( diff --git a/app/agent/runtime.py b/app/agent/runtime.py index 18f4f6897..4bed3cf2a 100644 --- a/app/agent/runtime.py +++ b/app/agent/runtime.py @@ -821,7 +821,7 @@ class AgentRuntimeManager: return default try: return int(value) - except TypeError, ValueError: + except (TypeError, ValueError): return default def _validate_runtime_config( diff --git a/app/agent/skills/metadata.py b/app/agent/skills/metadata.py index b313950ca..b3b0b81e7 100644 --- a/app/agent/skills/metadata.py +++ b/app/agent/skills/metadata.py @@ -113,7 +113,7 @@ def parse_skill_metadata( # noqa: C901 if raw_version is not None: try: version = int(raw_version) - except ValueError, TypeError: + except (ValueError, TypeError): logger.warning( "Invalid 'version' in %s (got %r), defaulting to 0", skill_path, diff --git a/app/agent/tools/manager.py b/app/agent/tools/manager.py index 4fc80b6c5..bc229233a 100644 --- a/app/agent/tools/manager.py +++ b/app/agent/tools/manager.py @@ -292,13 +292,13 @@ class MoviePilotToolsManager: if field_type == "integer" and isinstance(value, str): try: return int(value) - except ValueError, TypeError: + except (ValueError, TypeError): logger.warning(f"无法将参数 {key}='{value}' 转换为整数,返回 None") return None if field_type == "number" and isinstance(value, str): try: return float(value) - except ValueError, TypeError: + except (ValueError, TypeError): logger.warning(f"无法将参数 {key}='{value}' 转换为浮点数,返回 None") return None if field_type == "boolean": diff --git a/app/api/endpoints/download.py b/app/api/endpoints/download.py index 137e627ea..780c6f82a 100644 --- a/app/api/endpoints/download.py +++ b/app/api/endpoints/download.py @@ -101,7 +101,7 @@ def _build_unrecognized_media_info( ) try: media_type = MediaType(torrent.category) - except TypeError, ValueError: + except (TypeError, ValueError): media_type = MediaType.from_agent(torrent.category) if media_type == MediaType.COLLECTION: media_type = MediaType.MOVIE diff --git a/app/application/messaging/agent.py b/app/application/messaging/agent.py index a77ee402e..05f543642 100644 --- a/app/application/messaging/agent.py +++ b/app/application/messaging/agent.py @@ -1254,7 +1254,7 @@ async def terminate_web_agent_audio_process( return try: await process.communicate() - except OSError, ProcessLookupError: + except (OSError, ProcessLookupError): pass diff --git a/app/application/subscription/priority.py b/app/application/subscription/priority.py index b8f82492e..83df19870 100644 --- a/app/application/subscription/priority.py +++ b/app/application/subscription/priority.py @@ -32,7 +32,7 @@ def normalize_episode_priority( for episode, priority in episode_priority.items(): try: normalized[str(int(episode))] = int(priority) - except TypeError, ValueError: + except (TypeError, ValueError): continue return normalized @@ -98,7 +98,7 @@ def get_downloaded_best_version_episodes( for episode in subscribe.note or []: try: episode_number = int(episode) - except TypeError, ValueError: + except (TypeError, ValueError): continue if episode_number in target_episodes: downloaded.add(episode_number) @@ -110,7 +110,7 @@ def get_downloaded_best_version_episodes( episode_number = int(episode_key) if episode_number in target_episodes: downloaded.add(episode_number) - except TypeError, ValueError: + except (TypeError, ValueError): continue return sorted(downloaded) @@ -191,7 +191,7 @@ def compute_lack_episode( for episode in subscribe.note or []: try: episode_number = int(episode) - except TypeError, ValueError: + except (TypeError, ValueError): continue if episode_number in target_episodes: downloaded.add(episode_number) @@ -200,7 +200,7 @@ def compute_lack_episode( if float(priority) <= 0: continue episode_number = int(episode_key) - except TypeError, ValueError: + except (TypeError, ValueError): continue if episode_number in target_episodes: downloaded.add(episode_number) @@ -429,7 +429,7 @@ def get_downloaded_episodes(downloads: Optional[List[Context]]) -> List[int]: for episode in selected_episodes or []: try: downloaded_episodes.add(int(episode)) - except TypeError, ValueError: + except (TypeError, ValueError): continue return sorted(downloaded_episodes) @@ -480,7 +480,7 @@ def get_best_version_interested_episodes( for episode in selected_episodes: try: episode_num = int(episode) - except TypeError, ValueError: + except (TypeError, ValueError): continue if episode_num not in target_episodes: continue @@ -503,7 +503,7 @@ def prepare_best_version_tv_candidate( if is_full_best_version_enabled(subscribe): try: return int(priority or 0) > int(subscribe.current_priority or 0) - except TypeError, ValueError: + except (TypeError, ValueError): return False interested_episodes = get_best_version_interested_episodes( @@ -566,7 +566,7 @@ def should_prefer_full_pack_for_episode_best_version( try: resource_priority = int(priority or 0) - except TypeError, ValueError: + except (TypeError, ValueError): resource_priority = 0 episode_priority = get_episode_priority(subscribe) diff --git a/app/application/system.py b/app/application/system.py index df3bbb413..935bcc8ad 100644 --- a/app/application/system.py +++ b/app/application/system.py @@ -394,7 +394,7 @@ class SystemService: if cron: try: TimerUtils.normalize_schedule_trigger("cron", cron, self.settings.get("TZ")) - except TypeError, ValueError: + except (TypeError, ValueError): return "数据库备份周期格式不正确" backup_path = env.get("DB_BACKUP_PATH", self.settings.get("DB_BACKUP_PATH")) if backup_path is not None and not isinstance(backup_path, str): @@ -408,7 +408,7 @@ class SystemService: return f"{label}必须是大于等于 0 的整数" try: converted = int(value) - except TypeError, ValueError: + except (TypeError, ValueError): return f"{label}必须是大于等于 0 的整数" if converted < 0 or str(value).strip() != str(converted): return f"{label}必须是大于等于 0 的整数" diff --git a/app/chain/search/pagination.py b/app/chain/search/pagination.py index d6b557757..76f2a8642 100644 --- a/app/chain/search/pagination.py +++ b/app/chain/search/pagination.py @@ -78,7 +78,7 @@ class SearchPaginationOwner(_SearchOwnerBase): pages = get_chain_runtime_config_snapshot().search_resource_pages try: pages = int(pages) - except TypeError, ValueError: + except (TypeError, ValueError): return 1 return max(pages, 1) @@ -89,7 +89,7 @@ class SearchPaginationOwner(_SearchOwnerBase): """ try: start_page = int(page or 0) - except TypeError, ValueError: + except (TypeError, ValueError): start_page = 0 start_page = max(start_page, 0) return list(range(start_page, start_page + cls._get_search_resource_pages())) @@ -114,7 +114,7 @@ class SearchPaginationOwner(_SearchOwnerBase): subtitle_conf = (site or {}).get("subtitles") or {} try: page_size = int(subtitle_conf.get("result_num") or site.get("result_num") or 100) - except TypeError, ValueError: + except (TypeError, ValueError): page_size = 100 return page_size > 0 and len(page_results or []) >= page_size diff --git a/app/chain/search/provider.py b/app/chain/search/provider.py index 7ba598c5d..8b45a76b6 100644 --- a/app/chain/search/provider.py +++ b/app/chain/search/provider.py @@ -38,7 +38,7 @@ def _site_request_interval(site: SiteIndexer) -> float: """读取站点管理中已有的单次访问间隔配置。""" try: return max(0.0, float(site.get("limit_seconds") or 0)) - except TypeError, ValueError: + except (TypeError, ValueError): return 0.0 diff --git a/app/chain/search/recommend.py b/app/chain/search/recommend.py index 7dee0dfaf..66107293f 100644 --- a/app/chain/search/recommend.py +++ b/app/chain/search/recommend.py @@ -246,7 +246,7 @@ class SearchRecommendOwner(_SearchOwnerBase): for index in ai_indices: try: value = int(index) - except TypeError, ValueError: + except (TypeError, ValueError): continue if value in seen: continue diff --git a/app/chain/subscribe/completion.py b/app/chain/subscribe/completion.py index 7944c1639..9f77644f3 100644 --- a/app/chain/subscribe/completion.py +++ b/app/chain/subscribe/completion.py @@ -346,7 +346,7 @@ class SubscribeCompletionOwner(_SubscribeOwnerBase): for episode in episodes: try: episode_number = int(episode) - except TypeError, ValueError: + except (TypeError, ValueError): continue if episode_number not in self._SubscribeChain__get_best_version_target_episodes(subscribe): continue diff --git a/app/chain/subscribe/refresh.py b/app/chain/subscribe/refresh.py index eb85db836..e190ba43e 100644 --- a/app/chain/subscribe/refresh.py +++ b/app/chain/subscribe/refresh.py @@ -657,7 +657,7 @@ class SubscribeRefreshOwner(SubscribeMetadataOwner): for episode in episodes or []: try: episode_number = int(episode) - except TypeError, ValueError: + except (TypeError, ValueError): ignored.append({"episode": episode, "reason": "invalid"}) continue if episode_number not in target_episodes: diff --git a/app/cli.py b/app/cli.py index 1f55f4f63..1241ddb13 100644 --- a/app/cli.py +++ b/app/cli.py @@ -61,7 +61,7 @@ def _read_json_file(path: Path) -> Optional[Dict[str, Any]]: return None try: return json.loads(path.read_text(encoding="utf-8", errors="replace")) - except OSError, json.JSONDecodeError: + except (OSError, json.JSONDecodeError): return None @@ -84,7 +84,7 @@ def _get_process(runtime: Optional[Dict[str, Any]] = None) -> Optional[psutil.Pr try: process = psutil.Process(int(pid)) - except psutil.NoSuchProcess, psutil.AccessDenied, ValueError: + except (psutil.NoSuchProcess, psutil.AccessDenied, ValueError): return None try: @@ -92,7 +92,7 @@ def _get_process(runtime: Optional[Dict[str, Any]] = None) -> Optional[psutil.Pr return None if not process.is_running() or process.status() == psutil.STATUS_ZOMBIE: return None - except psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess: + except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): return None return process @@ -211,7 +211,7 @@ def _frontend_health( with urlopen(request, timeout=timeout) as response: raw = response.read().decode("utf-8", errors="replace").strip() return response.status == 200, {"version": raw} - except HTTPError, URLError: + except (HTTPError, URLError): return False, None @@ -234,7 +234,7 @@ def _git_current_branch() -> Optional[str]: cwd=str(_repo_root()), text=True, ).strip() - except OSError, subprocess.CalledProcessError: + except (OSError, subprocess.CalledProcessError): return None return branch or None diff --git a/app/scheduler/catalog.py b/app/scheduler/catalog.py index 11b2ca0eb..fdb3fb55d 100644 --- a/app/scheduler/catalog.py +++ b/app/scheduler/catalog.py @@ -77,7 +77,7 @@ class SchedulerCatalogOwner(_SchedulerOwnerBase): return None try: interval = int(interval) - except TypeError, ValueError: + except (TypeError, ValueError): return None return interval if interval > 0 else None diff --git a/app/scheduler/execution.py b/app/scheduler/execution.py index bc27035ac..de5e511dd 100644 --- a/app/scheduler/execution.py +++ b/app/scheduler/execution.py @@ -132,7 +132,7 @@ class SchedulerExecutionOwner(_SchedulerOwnerBase): """ try: parameters = inspect.signature(func).parameters - except TypeError, ValueError: + except (TypeError, ValueError): return False return "progress_callback" in parameters diff --git a/app/scheduler/progress.py b/app/scheduler/progress.py index 23c3b5524..9041d58e4 100644 --- a/app/scheduler/progress.py +++ b/app/scheduler/progress.py @@ -136,7 +136,7 @@ class SchedulerProgressOwner(_SchedulerOwnerBase): value = detail.get("value", 0) try: value = float(value) - except TypeError, ValueError: + except (TypeError, ValueError): value = 0.0 return _SchemaScheduleProgress( id=job_id, @@ -179,7 +179,7 @@ class SchedulerProgressOwner(_SchedulerOwnerBase): value = detail.get("value", 0) try: value = float(value) - except TypeError, ValueError: + except (TypeError, ValueError): value = 0.0 return _SchemaScheduleProgress( id=job_id, diff --git a/app/scheduler/reconcile.py b/app/scheduler/reconcile.py index f130a43dc..5676ff2e5 100644 --- a/app/scheduler/reconcile.py +++ b/app/scheduler/reconcile.py @@ -228,7 +228,7 @@ class SchedulerReconcileOwner(_SchedulerOwnerBase): trigger_value=trigger_value, timezone_name=config.timezone, ) - except TypeError, ValueError: + except (TypeError, ValueError): return None return next_run_time.isoformat(timespec="seconds") if next_run_time else None diff --git a/skills/downloader-operation/scripts/mp-downloader.py b/skills/downloader-operation/scripts/mp-downloader.py index 8d3a87f51..4b6f6b26b 100644 --- a/skills/downloader-operation/scripts/mp-downloader.py +++ b/skills/downloader-operation/scripts/mp-downloader.py @@ -386,7 +386,7 @@ def _jsonable(value: Any, *, depth: int = 0) -> Any: return _jsonable(data, depth=depth + 1) try: return _jsonable(dict(value), depth=depth + 1) - except TypeError, ValueError: + except (TypeError, ValueError): return str(value)