Skip to main content

base_ui/core/
error_handler.rs

1use 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            // 전체 오류 정보는 로그에만 기록
25            error!(
26                "Application crashed!\n\nError: {}\nLocation: {}\n\nStack trace:\n{:?}",
27                message,
28                location,
29                backtrace
30            );
31
32            // 메시지 박스에는 간단한 정보만 표시
33            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}