- update_plugin: change logger.exception to logger.error in non-except
branch (logger.exception outside an except block logs useless
"NoneType: None" traceback)
- update_plugin: remove duplicate logger.exception call in except block
(was logging the same failure twice)
- save_plugin_config validation: stop logging full plugin_config dict
(can contain API keys, passwords, tokens) and raw form_data values;
log only keys and validation errors instead
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- _infer_error_code: map Config* exceptions to CONFIG_LOAD_FAILED
(ConfigError is only raised by load_config(), so CONFIG_SAVE_FAILED
produced wrong safe message and wrong suggested_fixes)
- Remove leftover DEBUG logs in save_main_config that dumped full
request body and all HTTP headers (Authorization, Cookie, etc.)
- Replace dead FileNotFoundError/JSONDecodeError/IOError handlers in
get_dim_schedule_config with single ConfigError catch (load_config
already wraps these into ConfigError)
- Remove redundant local `from src.exceptions import ConfigError`
imports now covered by top-level import
- Strip str(e) from client-facing error messages in dim schedule handler
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Remove all traceback.format_exc() from client responses (33 remaining instances)
- Sanitize str(e) from client-facing messages, replacing with generic error messages
- Replace ~65 bare print() calls with structured logger.exception/error/warning/info/debug
- Remove ~35 redundant inline `import traceback` and `import logging` statements
- Convert logging.error/warning calls to use module-level named logger
- Fix WiFi endpoints that created redundant inline logger instances
- Add logger.exception() at all WebInterfaceError.from_exception() call sites
- Fix from_exception() in errors.py to use safe messages instead of raw str(exception)
- Apply consistent [Tag] prefixes to all logger calls for production triage
Only safe, user-input-derived str(e) kept: json.JSONDecodeError handlers (400 responses).
Subprocess template print(stdout) calls preserved (not error logging).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PR #282 narrowed bare except blocks but missed ConfigError from
config_manager.load_config(), which wraps FileNotFoundError,
JSONDecodeError, and OSError. Without this, a corrupt or missing
config crashes the display preview SSE endpoint instead of falling
back to 128x64 defaults.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>