Rust 恐慌的替代品!()和expect()用于--release?
在开发中,我的代码使用Rust 恐慌的替代品!()和expect()用于--release?,rust,panic,Rust,Panic,在开发中,我的代码使用.expect()和恐慌!()来处理致命错误 他们的行为正是我在开发过程中需要的 当我使用--release编译时,我希望它们的输出会变得更加简洁 i、 e.本守则: let mut file_a = OpenOptions::new().write(true) .read(true) .open(args.file_a).expect
.expect()
和恐慌!()
来处理致命错误
他们的行为正是我在开发过程中需要的
当我使用--release
编译时,我希望它们的输出会变得更加简洁
i、 e.本守则:
let mut file_a = OpenOptions::new().write(true)
.read(true)
.open(args.file_a).expect("foo bar");
生成:
thread 'main' panicked at 'foo bar: Os { code: 2, kind: NotFound, message: "No such file or directory" }', src/bin/vsapply.rs:131:59
当我只想:
foo bar: No such file or directory
使用编译时--发布
已经有办法了吗?和的组合解决了这个问题
use std::panic;
fn main() {
#[cfg(not(debug_assertions))]
panic::set_hook(Box::new(|panic_info| {
if let Some(s) = panic_info.payload().downcast_ref::<&str>() {
println!("panic occurred: {:?}", s);
} else {
println!("panic occurred");
}
}));
println!("Hello, world!");
panic!("nyaan");
}
当货物运行-释放时
:
Hello, world!
panic occurred: "nyaan"
您可以选择的一个方法是,使用eprintln将信息打印到stderr,而不是一味恐慌!()
并以非零错误代码退出
use std::process;
fn main() -> {
// some terrible state
eprintln!("foo bar: No such file or directory.");
process::exit(1);
}
这有几个好处:
- 打印到stderr可确保错误消息不会被定向到某个输出文件(例如,
foo--option arg1 arg2>output.txt
)
- 调用您的程序的程序可以将非零错误代码解释为故障指示
谢谢您的回答。我的代码每第二行或第三行都是unwrap()
或expect()
。手动检查每个条件将过于冗长,并使代码无法读取。你关于stderr的观点很重要-我将使用@akihito kirisaki的答案和eprintln!()
。这不太管用。使用--release
调用钩子代码,但不打印额外信息。e、 g.如果没有--release
我得到线程'main'的恐慌,因为'This delta期望文件长度为43999字节,而不是44020字节',src/bin/vsapply.rs:109:9注意:使用'RUST\u BACKTRACE=1'环境变量运行以显示回溯
,但是使用--release
我刚刚得到恐慌发生了
。(调用代码是panic!(“此增量预期文件b的长度为{:?}字节,而不是{:?}字节。”,len,blen);
)保持默认值panic似乎很好代码>使用挂起钩
并在自定义中调用它代码>。
use std::process;
fn main() -> {
// some terrible state
eprintln!("foo bar: No such file or directory.");
process::exit(1);
}