Skip to main content

workflow_egui/runtime/
panic.rs

1use crate::runtime::Runtime;
2use std::backtrace::Backtrace;
3use std::fs;
4use std::panic;
5
6/// Installs a panic hook that writes the panic info and backtrace to
7/// `application-panic.log` and then triggers a graceful runtime abort.
8pub fn init_graceful_panic_handler() {
9    let default_hook = panic::take_hook();
10    panic::set_hook(Box::new(move |panic_info| {
11        let backtrace = Backtrace::capture();
12        // println!("panic! \n{:#?}\n{:#?}", panic_info, backtrace);
13        let _ = fs::write(
14            "application-panic.log",
15            format!("{:#?}\n{:#?}", panic_info, backtrace),
16        );
17        println!(
18            "An unexpected condition (panic) has occurred. Additional information has been written to `application-panic.log`"
19        );
20        default_hook(panic_info);
21        Runtime::abort();
22    }));
23}
24
25/// Installs a panic hook that writes the panic info and backtrace to
26/// `service-panic.log` and then exits the process immediately.
27pub fn init_ungraceful_panic_handler() {
28    let default_hook = panic::take_hook();
29    panic::set_hook(Box::new(move |panic_info| {
30        let backtrace = Backtrace::capture();
31        let _ = fs::write(
32            "service-panic.log",
33            format!("{:#?}\n{:#?}", panic_info, backtrace),
34        );
35        default_hook(panic_info);
36        println!(
37            "An unexpected condition (panic) has occurred. Additional information has been written to `service-panic.log`"
38        );
39        println!("Exiting...");
40        std::process::exit(1);
41    }));
42}