openlang

main() 能否在不影响控制流程的情况下指定退出状态?

退出状态一定得通过 os.exit() 指定吗?在 main() 里调用 os.exit() 会让我无法使用 defer,并产生以下诊断。

Error: Unreachable defer statement due to diverging procedure call at the end of the current scope

这条 GitHub Discussion 提出了下面的办法。

Odin 的 main 过程能返回一个值吗? GitHub Discussion (https://github.com/odin-lang/Odin/discussions/3097) 比如,要模仿 C 的 int main(),可以另外定义一个能返回值的 proc,例如 run。然后 main 只需调用它,再根据它返回的错误作出合适的处理,比如用 os.exit() 以失败状态退出,或者执行应用需要的其他操作。

有没有其他办法,让 main() 指定退出状态,同时让 return、defer 和其余控制流程结构正常工作。

从英语翻译查看原文

后续讨论 3

顺着彼此的依据读下去
  1. 固定链接

    下面的方式可以同时使用 os.exit、return、defer、退出状态和 @fini 块。

    package main
    
    import "core:fmt"
    import "core:os"
    import "base:runtime"
    
    status_value: int
    main :: proc() {
        defer fmt.println("message deferred")
        if should_stop {
            status_value = 7
            return
        } else {
            status_value = 2
        }
        fmt.println("arbitrary message")
    }
    
    @fini
    finish :: proc "contextless" () {
        context = runtime.default_context()
        fmt.println("Program is terminating.")
        os.exit(status_value)
    }
    从英语翻译查看原文
  2. 固定链接

    把可能失败的代码移到独立函数里就行,不必直接处理 main 本身。

    handle: ^TaskResource
    
    execute :: proc() -> (problem: TaskError) {
        // ...
    }
    
    main :: proc() {
        problem: TaskError
        defer if problem != nil do os.exit(2)
    
        {
            // In place of .fini
            handle = alloc()
            defer release(handle)
    
            problem = execute()
        }
    }

    通常,为不同模式(例如 debug)配置自定义分配器/日志器时,也会采用这个模式,让实现本身保持不变。这也能保证 Odin 运行时仍可使用。

    从英语翻译查看原文

同一个问题的其他角度

  1. 发现输入文件缺失的情况

    你好,我写的脚本遇到了一个问题。在网上搜也没找到解决方法。 一个文件夹每天会收到一批固定的文件(至少理论上如此),大约保留 3 周。我要的文件内容像 csv,名字里总有两个字符串。“SDD_492813_030_031_IBZXCD” 和 “.csv…

    回复 2最近活动 powershell
  2. F# 检查文件是否存在时的取反操作

    我用这段代码在文件不存在时报错。 结果却出现了这个错误。我哪里理解错了?

    回复 2最近活动 fsharp
  3. 应用出现异常和错误时发送邮件提醒

    我想让应用每次遇到错误时都发一封邮件。 包含异常、.go 文件名和对应的行号。 这样对我们很有帮助

    回复 2最近活动 go