Expand description
A simple utility to take panic payloads, primarily obtained from
obtained from std::panic::catch_unwind or std::panic::set_hook,
and converting them into messages (&str’s)
§panic_message
panic_message takes a payload from [std::panic::catch_unwind] and returns a &str,
doing its best attempt to unpack a &str message from the payload, defaulting to the
literal "Box<dyn Any>" in an attempt to recreate what rustc does.
§Examples
use std::panic::catch_unwind;
let payload = catch_unwind(|| {
panic!("gus"); }).unwrap_err();
let msg = panic_message::panic_message(&payload);
assert_eq!("gus", msg);Non-string payload:
use std::panic::catch_unwind;
let payload = catch_unwind(|| {
std::panic::panic_any(1);
}).unwrap_err();
let msg = panic_message::panic_message(&payload);
assert_eq!("Box<dyn Any>", msg);§get_panic_message
get_panic_message is similar to panic_message, but returns an Option<&str>,
returning None when it can’t unpack a message from the payload
§Examples
use std::panic::catch_unwind;
let payload = catch_unwind(|| {
panic!("gus");
}).unwrap_err();
let msg = panic_message::get_panic_message(&payload);
assert_eq!(Some("gus"), msg);Non-string payload:
use std::panic::catch_unwind;
let payload = catch_unwind(|| {
std::panic::panic_any(1);
}).unwrap_err();
let msg = panic_message::get_panic_message(&payload);
assert_eq!(None, msg);§PanicInfo
This library also offers apis for getting messages from PanicInfo’s
as returned by std::panic::set_hook:
panic_info_messageis similar topanic_messageand has a default string"Box<dyn Any>"get_panic_info_messageis similar toget_panic_messageand returns anOption<&str>
§Example
std::panic::set_hook(Box::new(|pi| {
println!("{}", panic_message::panic_info_message(pi));
println!("{:?}", panic_message::get_panic_info_message(pi));
}));§Note
This library has methods that take values that are returned by standard mechanisms to obtain
panic payloads, as opposed to a single generic method that takes &dyn Any.
This is to prevent misuse.
For example, the reason to take PanicInfo and not the &dyn Any as returned by
PanicInfo::payload is because Box<dyn Any>
can be coerced into &dyn Any, which would make a method that takes &dyn Any possible
to misuse with a payload from std::panic::catch_unwind.
Functions§
- get_
panic_ info_ message - Attempt to produce a
&strmessage (with a default) from astd::panic::PanicInfo. See module docs for usage. - get_
panic_ message - Attempt to produce a
&strmessage from astd::panic::catch_unwindpayload. See module docs for usage. - panic_
info_ message - Attempt to produce a
&strmessage (with a default) from astd::panic::PanicInfo. See module docs for usage. - panic_
message - Attempt to produce a
&strmessage (with a default) from astd::panic::catch_unwindpayload. See module docs for usage.