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()을 흉내 내려면 값을 반환하는 run 같은 별도 proc을 만드세요. main은 그 함수를 호출하고 반환된 오류에 맞게 대응하면 됩니다 - 실패 상태로 os.exit()을 호출하거나 애플리케이션에 필요한 다른 동작을 하면 됩니다.

return, defer와 나머지 제어 흐름 구문이 평소처럼 동작하면서 main()이 다른 방법으로 종료 상태를 지정할 수 있나요.

영어에서 번역원문 보기

이어지는 대화 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 비슷하고 이름에는 늘 두 문…

    답글 2최근 활동 powershell
  2. F#에서 파일 존재 여부를 검사할 때의 부정 연산

    파일이 없으면 오류를 내려고 아래 코드를 쓰고 있어요. 그런데 이 오류가 나와요. 제가 뭘 잘못 이해한 건가요?

    답글 2최근 활동 fsharp
  3. 애플리케이션 예외와 오류를 이메일로 알리기

    애플리케이션에서 오류가 날 때마다 이메일을 보내고 싶습니다. 예외와 .go 파일 이름, 해당 줄 번호도요. 그러면 저희에게 정말 도움이 됩니다

    답글 2최근 활동 go