본문 바로가기
CS/Python

[python] 오류출력은 에러로 보내주세요 ! - print 함수의 출력을 stderr 로 보내기

by Warehaus 2021. 10. 6.

코드 리뷰를 하다 보면 너무나 자주 받는 피드백이 있다.

 

"에러에 대한 print는 stderr로 보내달라."

 

사실 이제 자연스럽게 할 법도 한데 습관이라는 게 참 만들기가 힘들다.

왜 stderr로 보내야할까? 라는 의구심이 들 수 있다.

 

'그냥 stdout으로 출력하면 어쨋든 볼 수 있는데?'

 

 

나는 이런 의구심에 대한 답변을 아래와 같이 할 것 같다.

 

"에러 로그는 따로 남길거에요, 같이 보면 디버깅하기 힘들거든요"

 

뭐 이것 말고도 다른 이유가 참 많을 거라고 생각이 된다.

 

다른 모듈에서 호출하는 경우에 stdout 과 stderr를 구분해서 출력하는 함수가 있다면, 일반적인 stdout에 에러 메시지들 까지 호출되어 버린다던가.. 

 

아니면.. 어떤 사람은 파이프를 이용해 stderr만 뽑아내는데 에러가 안 잡힌다던가.. 뭐 이런 이유가 있을 건데

 

이런 여러 예외 케이스들을 배제하기 위해서라도 에러 메시지는 stderr로 보내는 것이 좋을 것이다.

 

그래서, 코드에서는 어떻게 해야 하나?

 

아래는 그냥 출력 메시지를 찍었을 때이다.

 

print("Hello world")

 

출력은 다음과 같이 나온다. 

보나 마나이긴 하다.

 

 

 stderr로 에러를 출력하는 테스트 코드를 아래처럼 만들어봤다.

 

import sys

print("Hello world")

# Error
err = True

if err:
    print ("Hello world error!", file=sys.stderr)

 

이 또한 실행하면 모두 출력될 것이다. 아무 짓도 안 하면 이렇게 출력은 다 나오게 된다.

 그런데 어떤 유능한(?) 시스템 운영자가 에러에 대한 출력만 보고 싶어서 stdout(표준 출력)을 /dev/null로 날려버리는 경우에,

아래와 같이 에러 메시지만 나오게 된다.

에러가 난 경우만 볼 수 있다.

개발자가 코드를 표준 에러로 출력 해 줌으로써, 운영자 또는 사용자는 해당 프로그램의 에러를 더 쉽게 찾아낼 수 있다.

이 것은 사실 개발자한테도 편한 일이다.

 

운영자가 에러 메시지가 표준 출력으로 가능지, 표준 에러로 가는지 까지는 잘 알기가 쉽지 않다. 에러 케이스에서 출력을 모두 표준 출력으로만 보내게 되어버리는 경우, 이를 사용하는 사람은 이게 에러 메시지인지 아닌지 구분하기가 많이 힘들 것이다. 

( 물론 'Error' 같은 접두사를 붙여주겠지만 말이다.)

 

결론적으로 개발자는 최대한 에러 메시지는 표준 에러로 보내줘야 하는 게 올바른 방향이라 생각하고, 언어를 떠나서 최대한 그렇게 구현해 줘야 더 나이스 한 프로그램이 될 것이라 믿는다.

 

끝.