feat(error-handling): add network error differentiation, retry, and REST API detection (C.5)

WordPress client improvements:
- Add ConnectionError exception for network-level failures
- Differentiate DNS, SSL, timeout, and connection refused errors
- Add retry with exponential backoff for transient errors (502, 503, 504, 429)
- Auth/config errors are never retried
- Add request timeout (30s default)

Health check improvements:
- Detect REST API disabled (403/404 on /wp-json)
- Classify errors by type: dns_failure, ssl_error, timeout, connection_refused

Bare except cleanup:
- Replaced all bare except: with except Exception: across 12 files

Tests: 303 passed (13 new tests for error handling)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
airano
2026-02-19 14:58:16 +03:30
parent c57fd666c9
commit 647a650629
12 changed files with 559 additions and 67 deletions

View File

@@ -599,7 +599,7 @@ class WPCLIManager:
size_str = f"{size_bytes / (1024 * 1024):.1f} MB"
else:
size_str = "unknown"
except:
except (ValueError, IndexError, OSError):
size_str = "unknown"
return {
@@ -1198,7 +1198,7 @@ class WPCLIManager:
site_cmd = "core version"
version_result = await self._execute_wp_cli(site_cmd)
current_version = version_result.get("message", "unknown").strip()
except:
except Exception:
current_version = "unknown"
return {
@@ -1220,7 +1220,7 @@ class WPCLIManager:
try:
version_result = await self._execute_wp_cli("core version")
old_version = version_result.get("message", "unknown").strip()
except:
except Exception:
old_version = "unknown"
# Execute update (long timeout for downloads)
@@ -1230,7 +1230,7 @@ class WPCLIManager:
try:
version_result = await self._execute_wp_cli("core version")
new_version = version_result.get("message", "unknown").strip()
except:
except Exception:
new_version = "unknown"
# Determine update type