Summary
Defense-in-depth follow-up to v0.3.2's hotfix. v0.3.2 fixed the specific
logger.add(None, ...) crash, but a static sweep found another identical-shape
vulnerability in cli.py, and the bundle still had no last-resort handler for
any unhandled exception escaping main(). v0.3.3 plugs both holes so a future
regression of the same family ("stdio is None in windowed bundle") still leaves
the user with a friendly Qt dialog and a crash log on disk — never the opaque
PyInstaller "Unhandled exception in script" box again.
No functional changes for users on v0.3.2 who never hit a crash — this is
purely belt-and-suspenders.
Fixed
cli.py main(): configuration-error fallbackprint(file=sys.stderr)was
vulnerable to the samesys.stderr is Nonefailure that took out
v0.3.0/v0.3.1. A user with a malformed/missing.envwould have triggered it.
Added
__main__.py: installedsys.excepthook = _last_resort_handle. Any uncaught
exception now (1) writes a timestamped traceback to
%APPDATA%\Doppelvoice\logs\crash.logand (2) shows a Qt
QMessageBox.criticalwith the trace tail and the log path. Falls back
gracefully if Qt itself is unavailable.
Verified
End-to-end smoke from a fresh extraction directory (not the project root):
- GUI double-click → launches clean, no
crash.logproduced Doppelvoice.exe --help→ 9-language description stringDoppelvoice.exe --check(no.env) → exit 2 + Chinese friendly error
Download
Doppelvoice-v0.3.3-win64.zip (60.5 MB)
SHA256: 7D259E46ACC0D4E3B4E57A3630B4F3D4E94F0B1CB3CFF7CA21E0A5A55FEFE193
Unzip, double-click Doppelvoice.exe, paste your Doubao AppID + AccessToken
into the Settings dialog. No .env editing required.