base_ui/core/
error_handler.rs1use backtrace::Backtrace;
2use log::error;
3use native_dialog::{ MessageDialog, MessageType };
4use std::panic;
5
6pub fn initialize_error_handler() {
7 panic::set_hook(
8 Box::new(move |panic_info| {
9 let message = if let Some(s) = panic_info.payload().downcast_ref::<String>() {
10 s.clone()
11 } else if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
12 s.to_string()
13 } else {
14 "Unknown panic occurred".to_string()
15 };
16
17 let location = panic_info.location().map_or_else(
18 || "Unknown location".to_string(),
19 |loc| format!("{}:{}", loc.file(), loc.line())
20 );
21
22 let backtrace = Backtrace::new();
23
24 error!(
26 "Application crashed!\n\nError: {}\nLocation: {}\n\nStack trace:\n{:?}",
27 message,
28 location,
29 backtrace
30 );
31
32 let dialog_msg = format!(
34 "Application crashed!\n\nError: {}\nLocation: {}\n\nCheck the log for more details.",
35 message,
36 location
37 );
38
39 MessageDialog::new()
40 .set_type(MessageType::Error)
41 .set_title("Fatal Error")
42 .set_text(&dialog_msg)
43 .show_alert()
44 .unwrap_or(());
45
46 std::process::exit(1);
47 })
48 );
49}