Rust 有没有办法使expect()输出的消息更方便用户?
我发现由生成的消息对用户非常不友好。考虑下面的简短例子…Rust 有没有办法使expect()输出的消息更方便用户?,rust,Rust,我发现由生成的消息对用户非常不友好。考虑下面的简短例子… use std::env; fn main() { let imagefn = env::args().skip(1).next().expect("Filename not provided."); println!("{}", imagefn); } 这些错误包括: 线程“main”在“未提供文件名”处惊慌失措,libcore/option.rs:960:5 注意:使用'RUST_BACKTRACE=1'运行回溯跟
use std::env;
fn main() {
let imagefn = env::args().skip(1).next().expect("Filename not provided.");
println!("{}", imagefn);
}
这些错误包括:
线程“main”在“未提供文件名”处惊慌失措,libcore/option.rs:960:5
注意:使用'RUST_BACKTRACE=1'运行回溯跟踪。
我发现expect()
对于编写快速代码非常有用,但希望我能输出更多类似的内容:
未提供文件名。
隐藏所有其他信息,除非我实际提供环境变量,作为开发人员,我应该知道。我想我的问题是:
expect()
来执行此操作expect()
即使在发布版本中也会输出其不友好的消息panic的一个方便的条件调用!()
:
理想情况下,您应该在返回选项或结果的函数中使用?
运算符来处理此问题,以便能够以更优雅的方式处理此类问题
如果您只想返回外观更友好的消息并退出,您可以实现自己的功能,打印消息并以终止。您可以使用更改紧急消息。例如:
use std::panic::set_hook;
fn main() {
set_hook(Box::new(|info| {
if let Some(s) = info.payload().downcast_ref::<String>() {
println!("{}", s);
}
}));
// Displays: "My error message":
Option::None::<i32>.expect("My error message");
}
请注意,您可以创建自己的扩展方法来处理自定义类型。在panic hook中,如果您可以向下转换到自定义类型,您可以确定恐慌的起源。询问我们推荐或查找书籍、工具、软件库的问题,教程或其他非站点资源与堆栈溢出无关,因为它们往往会吸引固执己见的答案和垃圾邮件-我已经从您的其他好问题中删除了这些内容。总的来说,我认为您的看法不正确<代码>预期
不应用于用户可能合理看到或导致的错误。它的目的是针对程序员级错误。其他一切都应该由你的程序来处理。@Shepmaster我明白了。我写了“我发现expect()对于编写快速代码非常有用”。。。您是对的,真正的错误处理应该在非平凡的脚本中使用。expect
可以通过宏来改进。
use std::panic::set_hook;
fn main() {
set_hook(Box::new(|info| {
if let Some(s) = info.payload().downcast_ref::<String>() {
println!("{}", s);
}
}));
// Displays: "My error message":
Option::None::<i32>.expect("My error message");
}
#![feature(panic_info_message)]
use std::panic::set_hook;
fn main() {
set_hook(Box::new(|info| {
println!("{:?}", info.message().unwrap());
}));
Option::None::<i32>.expect("My error message");
}