Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 恐慌的替代品!()和expect()用于--release?_Rust_Panic - Fatal编程技术网

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