2 个不稳定版本
0.3.0 | 2021 年 8 月 27 日 |
---|---|
0.2.0 | 2021 年 8 月 26 日 |
981 在 Rust 模式
53,069 每月下载量
用于 66 个 crate (16 个直接使用)
8KB
65 行
从 panic 负载中获取信息
查看 文档 获取更多信息。
许可证
该项目受 Apache License 2.0 或 MIT 许可证许可。除非您明确说明,否则您提交的任何贡献,根据 Apache-2.0 许可证定义,应按上述方式双重许可,而不附加任何额外条款或条件。
lib.rs
:
一个简单的实用工具,用于获取 panic 负载,主要从 std::panic::catch_unwind
或 std::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_message
与 panic_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
返回
panic_info_message
与panic_message
类似,并且有一个默认字符串"Box<dyn Any>"
get_panic_info_message
与get_panic_message
类似,并返回一个Option<&str>
示例
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
的有效载荷。