#payload #messages #str #info #catch-unwind #panic-info

panic-message

从 panic 负载中获取 panic 信息

2 个不稳定版本

0.3.0 2021 年 8 月 27 日
0.2.0 2021 年 8 月 26 日

981Rust 模式

Download history 16360/week @ 2024-03-14 12989/week @ 2024-03-21 15898/week @ 2024-03-28 15520/week @ 2024-04-04 20043/week @ 2024-04-11 20373/week @ 2024-04-18 16713/week @ 2024-04-25 12823/week @ 2024-05-02 13419/week @ 2024-05-09 13125/week @ 2024-05-16 12059/week @ 2024-05-23 12399/week @ 2024-05-30 11883/week @ 2024-06-06 11974/week @ 2024-06-13 15084/week @ 2024-06-20 11726/week @ 2024-06-27

53,069 每月下载量
用于 66 个 crate (16 个直接使用)

MIT/Apache

8KB
65

从 panic 负载中获取信息

查看 文档 获取更多信息。

许可证

该项目受 Apache License 2.0 或 MIT 许可证许可。除非您明确说明,否则您提交的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,而不附加任何额外条款或条件。


lib.rs:

一个简单的实用工具,用于获取 panic 负载,主要从 std::panic::catch_unwindstd::panic::set_hook 获取,并将它们转换为消息(&str

panic_message

panic_message[std::panic::catch_unwind] 获取负载,并返回一个 &str,尽可能从负载中解包一个 &str 消息,默认为字面量 "Box<dyn Any>",以尝试重现 rustc 的行为。

示例

use std::panic::catch_unwind;

let payload = catch_unwind(|| {
    panic!("gus"); }).unwrap_err();

let msg = panic_message::panic_message(&payload);
assert_eq!("gus", msg);

非字符串负载

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_messagepanic_message 类似,但它返回一个 Option<&str>,当它无法从有效载荷中解包消息时返回 None

示例

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);

非字符串负载

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

这个库还提供了从 PanicInfo 获取消息的 API,该消息由 std::panic::set_hook 返回

示例

std::panic::set_hook(Box::new(|pi| {
    println!("{}", panic_message::panic_info_message(pi));
    println!("{:?}", panic_message::get_panic_info_message(pi));
}));

注意

这个库有方法接受由标准机制返回的值以获取 panic 有效载荷,而不是接受 &dyn Any 的单个泛型方法。这是为了防止误用。例如,选择 PanicInfo 而不是 PanicInfo::payload 返回的 &dyn Any 的原因是因为 Box<dyn Any> 可以被强制转换为 &dyn Any,这将使接受 &dyn Any 的方法可能被误用,使用来自 std::panic::catch_unwind 的有效载荷。

无运行时依赖