use std::panic::{catch_unwind, UnwindSafe};
use crate::error::any_error::ToErrorMsg;
use crate::error::last_error::set_error_msg;
pub(crate) fn catch_panic<T, F>(f: F) -> Option<T>
where
F: FnOnce() -> Result<T, anyhow::Error> + UnwindSafe,
{
let result = catch_unwind(f);
match result {
Ok(Ok(value)) => Some(value),
Ok(Err(err)) => {
let err = err.to_string();
eprintln!("Caught panic with error: {}", err);
set_error_msg(err);
None
}
Err(err) => {
if let Some(msg) = panic_message::get_panic_message(&err) {
eprintln!("Caught panic with error: {}", msg);
set_error_msg(msg.to_string());
} else {
let err = err.into_error_msg();
eprintln!("Caught panic with error: {}", err);
set_error_msg(err);
}
None
}
}
}