forked from 1b-agent/opencadstudio-upstream
fix(background): keep the app alive when a background worker panics
Bug: background_task joined the worker thread with .expect(...). Any panic inside a background closure (decoding a malformed file, an unexpected None) was re-raised on the main thread and took the whole application down, even though the worker's failure was already contained. Reproduce: 1. Run an operation that executes in a background worker, e.g. loading or converting a deliberately corrupted file whose decoder panics. 2. Before: the process dies with the worker's panic message. 3. After: the command line shows "background task failed: <label> - <panic>" and the application keeps running. Fix: The worker closure is wrapped in catch_unwind; a panic is converted to Message::BackgroundTaskFailed(context, message) delivered back to the update loop and surfaced as a command-line error. Each call site passes a context label naming the operation. A failed thread join (thread aborted) is handled the same way instead of expect().
This commit is contained in:
1 parent
2d6f4fcfdf
commit
3345b6453e
4 files changed
+115
-6
No files matched your search
@@ -5288,6 +5288,7 @@ impl OpenCADStudio {
|
||||
let worker_display = display_name.clone();
|
||||
|
||||
file::background_task(
|
||||
crate::t!("WBLOCK save"),
|
||||
move || {
|
||||
let out_doc = match source_mode {
|
||||
WblockSourceMode::Block => {
|
||||
@@ -9717,6 +9718,12 @@ impl OpenCADStudio {
|
||||
Task::none()
|
||||
}
|
||||
|
||||
Message::BackgroundTaskFailed { context, detail } => {
|
||||
self.command_line
|
||||
.push_error(crate::tf!("{context} failed: {detail}").as_ref());
|
||||
Task::none()
|
||||
}
|
||||
|
||||
// ── Print to system printer ───────────────────────────────────────
|
||||
Message::PrintToPrinter => self.on_print_to_printer(),
|
||||
Message::PrintResult(Ok(printer)) => {
|
||||
|
||||
Reference in new issue
Block a user