os.Exit () 및 panic ()을 언제 사용합니까?


92

누군가의 주요 차이점 os.Exit()panic()Go에서 실제로 사용되는 방법을 설명 할 수 있습니까?


11
향후 Go 코드 읽기에 도움이 될 수있는 주석입니다. 많은 예제 코드 panic에서 순전히 이해하기 쉽고 다른 패키지를 가져 오지 않기 때문에 오류시 종료하는 데 사용됩니다. 이것은 그것이 훌륭하거나 관용적 인 연습이라는 것을 의미하지 않습니다! . 예제 코드를위한 공간 절약 장치 일뿐입니다. 매우 특별한 상황을 panic위한 IRL 예약 .
Intermernet

1
흠 .. 좋음) 특히 "IRL"약어-저에게는 새로운 것입니다. :) 패닉이 패키지 가져 오기를 제거하는 방법을 설명해 주시겠습니까?
Timur Fayzrakhmanov 2015

4
panic내장입니다. 같은 것을 사용하는 (상황에 따라) 권장 os.Exit, log.Fatal(가능하면 항상 권장) OS에 오류 코드를 반환 등. 여기에는 모두 패키지 가져 오기가 포함되므로 예제 코드가 "정리"됩니다. 예제 코드는 항상 특정 문제에 대한 해결책을 보여주기 위해서만 사용해야합니다. 코드에 다른 문제가있을 수 있으며, 제대로 설명하면 코드가 더 복잡해 지므로 주어진 답변에 대한 설명이 손상 될 수 있습니다. YMMV.
Intermernet

1
좋아요, 알았습니다!) 큰 감사) 제 어휘에 대한 또 다른 약어가 있습니다. :)
Timur Fayzrakhmanov

2
NP, 도움을 행복하고 acronymic 사전 :-) 증가
Intermernet

답변:


84

우선, "실제로 사용되는 방법"에 대한 질문이있을 때마다 Go 소스 코드 (또는 실제로는 충분히 큰 Go 코드베이스) 및 패키지 문서검색 하는 것이 좋습니다. 답변을.

지금 os.Exitpanic상당히 다르다. panic프로그램 또는 그 부분이 복구 불가능한 상태에 도달했을 때 사용됩니다.

panic와 같은 범위를 벗어 조각을 색인 또는 형의 주장을 실패로 런타임 오류를 암시 적으로 포함라고, 즉시 현재 함수의 실행을 중지하고 길을 따라 어떤 연기 기능을 실행되는 goroutine의 스택을 풀기 시작한다. 해제가 고 루틴 스택의 맨 위에 도달하면 프로그램이 종료됩니다.

os.Exit복구 가능성이 없거나 지연된 정리 명령문을 실행하지 않고 프로그램을 즉시 중단하고 오류 코드 (다른 프로그램이 발생한 상황을보고하는 데 사용할 수 있음)를 반환해야 할 때 사용됩니다. 이것은 테스트에서 유용합니다.이 테스트가 실패한 후 다른 테스트도 실패한다는 것을 이미 알고있는 경우, 지금 종료하는 것이 좋습니다. 프로그램이 필요한 모든 작업을 수행하고 이제 종료해야 할 때 (예 : 도움말 메시지를 인쇄 한 후) 사용할 수도 있습니다.

대부분의 경우 사용하지 않으며 panic( error대신을 반환해야 함 ) os.Exit테스트 및 빠른 프로그램 종료를 위해 일부 경우를 제외하고는 거의 필요하지 않습니다 .


9
"이것은 테스트에서 유용합니다.이 테스트가 실패한 후에 다른 테스트도 실패한다는 것을 이미 알고있는 경우…"이것은 종속 테스트의 테스트 안티 패턴 냄새가납니다. 잘 작성된 테스트 스위트에서 각 테스트는 독립적입니다. 주어진 테스트의 결과가 다른 테스트의 결과를 결정해서는 안됩니다.
gotgenes

1
@gotgenes 반드시 그런 것은 아닙니다. 특정 함수가 nil이 아닌 구조체를 반환하는 테스트가 있고 해당 테스트가 실패하면 구조체의 값을 검사하는 모든 테스트도 실패 할 것으로 예상 할 수 있습니다. 테스트가 아니라 종속 된 코드입니다. (그건 내가 사용하지 것이라고 말했다 exit, 난 그냥 실패 주장의 큰 스택을 기대할 수있는 경우에.)
데이비드 두더지

83

우선 os.Exit(), 오류없이 정상적으로 프로그램을 종료하는 데 사용할 수 있으며 당황하지 않을 수 있습니다. 이것이 하나의 중요한 차이점입니다. 다른 하나는 어딘가에서 패닉이 포착되고 무시되거나를 사용하여 기록 될 수 있다는 것 recover입니다.

그러나 잘못된 종료 코드에 대해 이야기하고 있다면 다음과 같이 가정 해 보겠습니다.

panic뭔가 끔찍하게 잘못되었을 때 사용합니다 . 아마도 프로덕션으로 가기 전에 잡았어야 할 프로그래머 오류 일 것입니다. 이것이 스택을 인쇄하는 이유입니다.

os.Exit(errorCode)원하는 경우 또는 이와 유사한 것을 사용하십시오 .

  1. 스크립팅 목적으로 프로그램의 종료 코드를 제어합니다.

  2. 예상되는 오류 (예 : 사용자 입력 오류)에 대해 순서대로 종료하기를 원합니다.

그래서 기본적으로 패닉은 당신을위한 것이고, 나쁜 종료 코드는 당신의 사용자를위한 것입니다.


덕분에 매우 도움)!
티무르 Fayzrakhmanov

14
"그래서 기본적으로 패닉은 당신을위한 것이고 나쁜 종료 코드는 당신의 사용자를위한 것입니다." <-굉장한 팁
psousa

1
panic ()이 평범한 C에서 일반적인 assert () 호출과 어떻게 든 관련이 있다고 말할 수 있습니까? 글쎄 .. 나는 항상 프로덕션으로 푸시하기 전에 어설 션 호출을 제거한다는 것을 알고 있으며 새로운 기능을 테스트 할 때만 활성화합니다. 내가 말하는 것은 대부분의 경우 assert ()를 사용하여 내 코드에서 참이어야한다고 생각하는 불변성을 확인하는 것입니다. panic ()에 대해 동일한 사용법이 보이십니까? :-)
Baumes 입

7

주요 차이점은 다음과 같습니다.

  1. os.Exit 지연된 함수의 실행을 건너 뜁니다.
  2. 를 사용 os.Exit하면 종료 코드를 지정할 수 있습니다.
  3. panic종료되는 동안 종료 os.Exit되지 않습니다. (다른 답변은 이것을 언급하지 않는 것 같습니다.)

지연된 함수를 실행해야하는 경우 선택의 여지가 없지만 panic. (반면, 지연된 함수 실행을 건너 뛰려면을 사용하십시오 os.Exit.)

void가 아닌 함수가 다음과 같이 정의 된 경우 :

  1. 함수에는 많은 분기가 포함되어 있습니다.
  2. 모든 분기는 return또는 로 종료됩니다.panic

그럼 당신은 대체 할 수 없습니다 panicos.Exit"기능의 끝에 반환 누락"라고, 그렇지 않으면 컴파일러는 프로그램을 컴파일을 거부합니다. (Go는 여기에서 매우 멍청 log.Panic하고 기능을 종료하지도 않습니다.)

다른 조건에서 :

  1. panic프로그래밍 논리 오류와 같이 실제로 유선이 발생할 때 사용 합니다.
  2. os.Exit지정된 종료 코드로 즉시 종료를 원할 때 사용하십시오 .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.