当前位置: 首页 > 知识库问答 >
问题:

在Rust中,如果主函数返回Err,会发生什么?

苏墨竹
2023-03-14

根据锈迹参考,

如果存在main函数(snip),其返回类型必须是以下类型之一:

>

  • ()

    结果

    但它没有说明当main()返回()Ok())Err(

    据我测试

    这些行为是否在某些文档中定义、明确解释或保证?特别是,我可以假设

    >

  • main()返回Err(时,程序始终以1状态退出

    main()返回Err时显示的错误消息(

    笔记:

    >

  • 我想要某种记录在案的保证,而不是经验性的解释。这就是为什么我添加了#语言-律师标签。

    这个问题不是关于什么时候应该使用()以及什么时候应该使用Result


  • 共有2个答案

    公孙黎昕
    2023-03-14

    这种行为由RFC1937中添加的std::process::TerminationTrait控制。具体来说,“hidden”lang_start()函数调用main(),大致如下:

    fn lang_start<T: Termination>(
        main: fn() -> T,
        argc: isize,
        argv: *const *const u8
    ) -> !
    

    也就是说,main()可以返回任何T:终止。在std中有终止的实现对于()std::process:ExitCode,以及一些Result

    对于您的问题,语言律师模式:任何依赖于终止的程序的确切行为都不是由语言本身严格指定的。它是std实现的一部分,而不是语言参考的一部分。这意味着,当使用不同版本的编译器(绑定到不同的std版本)编译时,同一个程序可能会有不同的行为。Err案例中打印错误的确切行为已记录在案,但未指定。由于RFC 1937明确寻找类似POSIX的行为,您可以合理地确信,该程序不会以惊人的方式运行(例如,在Err-case中以状态0退出)。

    邹毅
    2023-03-14

    来自main的不同返回值的行为由std::process::Terminationtrait定义:

    trait std::process::Termination

    在主函数中实现任意返回类型的特性。

    此特性记录为成功时返回libc::EXIT_SUCCESS,错误时返回libc::EXIT_FAILURE

    默认实现返回libc::EXIT_SUCCESS,表示执行成功。如果出现故障,则返回libc::EXIT_failure

    但在非POSIX系统上,这些值不能保证为0和1。

    至于打印错误消息,Terination需要E: Debug并将Debugimpl打印到stderr,但我不相信它能保证保持完全相同。

    impl<E: fmt::Debug> Termination for Result<!, E> {
        fn report(self) -> ExitCode {
            let Err(err) = self;
            eprintln!("Error: {:?}", err);
            ExitCode::FAILURE.report()
        }
    }
    

    来源

     类似资料:
    • 问题内容: 我正在创建一个需要实施的游戏。在游戏过程中,我想在特定时间内暂停监听器。我尝试从方法返回false ,但方法仍然保持执行状态。还有其他方法可以让监听器暂停一段时间吗?任何人都请解释一下从错误返回的实际含义是什么? 问题答案: 从View文档中: 如果您返回,则告诉android媒体已经处理完毕。算了吧。 如果您返回,则基本上会说“不是我的问题,请其他人来处理此点击”。然后android

    • 问题内容: 我创建了一个从API获取URL并返回URL字符串作为结果的函数。但是,Xcode给我此错误消息: void函数中非预期的非无效返回值 有谁知道为什么会这样吗? 问题答案: 使用闭包而不是返回值:

    • hashcode或hashmap是如何工作的,如果我们重写hashcode返回的总是常量,而重写的equals方法返回false,它如何能够在返回或删除时识别准确的对象?时间bean忘记了性能所有的东西,我的问题是它如何能够识别精确的对象,让我再解释一点,我有一个有两个字段的person类,已经重写了返回总是1的hashcode和重写了返回false的equals方法,已经创建了3个对象,对象1-

    • 问题内容: 有人可以提供goroutine返回的澄清值。从goroutine返回的值是否已存入抵押。 例如: 我们是否应该避免在go例程中避免返回值? 问题答案: 快速查看一下组装输出显示 该函数确实将其结果存储到堆栈中 因此,当从goroutine调用它时,它会将结果存储到堆栈中。但是,这是一个新的堆栈,当goroutine结束时,该堆栈会被破坏,因此无法获取返回值。 但是,无法检索这些结果。

    • 在 C 中,当一个应该返回对象的函数在没有 return 语句的情况下结束时会发生什么?会得到什么回报? 例如。

    • 问题内容: 我试图在postgres函数内返回查询结果。我尝试了一下,并完美地工作了: 问题是我需要一些东西来返回以下结果: 我需要什么回报,或者应该改变什么才能实现这一目标? 问题答案: 这可以通过一个简单的SQL函数来完成: 可以在手册中找到更多详细信息和示例:http : //www.postgresql.org/docs/current/static/xfunc-sql.html#XFUN