如何从 main() 返回一个字符串作为错误?

问题描述 投票:0回答:1

一直在尝试编写一个函数来做到这一点。

fn main() -> Result<i32, i32> {
    let clargs: Vec<String> = env::args().collect();

    // validate command line arguments
    if clargs.len() != 3 {
        // clargs[0] is the name of the executable
        print_usage(&clargs[0]);
        return Err(1);
    }

    return Ok(0);
}

fn print_usage(exe_name: &String) {
    eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}

我也尝试过这个。

fn main() -> Result<(), std::io::Error> {
    let clargs: Vec<String> = env::args().collect();

    // validate command line arguments
    if clargs.len() != 3 {
        // clargs[0] is the name of the shacker1 executable
        print_usage(&clargs[0]);
        return Err("error: invalid number of arguments.");
    }

    return Ok(());
}

fn print_usage(exe_name: &String) {
    eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}

但我不知道如何将字符串转换为错误。在文档中找不到它。找不到例子。

如何返回像我在这里所做的那样的东西?

rust error-handling program-entry-point
1个回答
5
投票

有几种可能的方法可以从 Rust 程序返回特定的错误代码。 一种是返回实现 Termination 特征的

something
。 可以是
ExitCode
,代表退出状态; a
Result<T, E>
,其中
T
实现
Termination
并且
E
实现
Debug
;或其他一些事情之一。

因此,返回状态代码的最简单方法是:

use std::env;
use std::process::ExitCode;

fn main() -> ExitCode {
    let clargs: Vec<String> = env::args().collect();

    // validate command line arguments
    if clargs.len() != 3 {
        // clargs[0] is the name of the executable
        print_usage(&clargs[0]);
        return 2.into();
    }

    0.into()
}

fn print_usage(exe_name: &String) {
    eprintln!("Usage: {exe_name} <word_file> <hash_sha1>");
}

ExitCode
实现了
From<u8>
,因此您只需在
.into
上调用
u8
就可以了。 请注意,这为您提供了最大的灵活性,因为它允许您返回任何您想要的不成功状态。

你也可以这样做(仅显示

main
):

fn main() -> Result<(), &'static str> {
    let clargs: Vec<String> = env::args().collect();

    // validate command line arguments
    if clargs.len() != 3 {
        // clargs[0] is the name of the executable
        print_usage(&clargs[0]);
        return Err("invalid number of arguments");
    }

    Ok(())
}

这是可行的,因为

&'static str
实现了
Debug
。 请注意,这不会让您对退出状态有太多控制,这可能是也可能不是问题。

最后,您只需拨打

std::process::exit
即可。 这可以在任何地方完成,但这显示了如果您愿意的话可以如何做(仅显示
main
do_main
):

fn do_main() -> i32 {
    let clargs: Vec<String> = env::args().collect();

    // validate command line arguments
    if clargs.len() != 3 {
        // clargs[0] is the name of the executable
        print_usage(&clargs[0]);
        return 2;
    }

    0
}

fn main() {
    std::process::exit(do_main());
}

请注意,

i32
没有实现
Termination
,因此您不能使用
Result<i32, i32>
作为返回类型。 您可以使用
Result<ExitCode, i32>
,但这会打印错误
i32
,您可能不希望这样,因此简单地返回
ExitCode
会更符合您的要求。

© www.soinside.com 2019 - 2024. All rights reserved.