Crate panic_message

Source
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:

§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§