Excel & IT Info

아이엑셀러 닷컴, 엑셀러TV

Python

파이썬에서 오류를 처리하는 방법

권현욱(엑셀러) 2024. 2. 17. 20:00
반응형

VBA에는 With ~ End With 구문이 있습니다. 반복되는 구문을 단순하게 표현함으로써 코딩 효율을 높여주는 역할을 합니다. 파이썬의 with 문은 오류 처리를 할 때 사용합니다. 오류 처리(Error handling)는 프로그래밍에서 매우 중요합니다. with 문을 포함하여 파이썬에서 오류를 처리하는 방법에 대해 소개합니다.

 

권현욱(엑셀러) | 아이엑셀러 닷컴 대표 · Microsoft Excel MVP · Excel 솔루션 프로바이더 · 작가

 

(이미지: 아이엑셀러 닷컴)

 

※ 이 글은 아래 기사 내용을 토대로 작성되었습니다만, 필자의 개인 의견이나 추가 자료들이 다수 포함되어 있습니다.


  • 원문: How to Use the with Statement in Python
  • URL: https://thenewstack.io/how-to-use-the-with-statement-in-python/

개요

오류 처리는 프로그래밍에서 매우 중요한 개념입니다. 오류 처리가 없으면 애플리케이션이 비정상적인 입력이나 조건을 효과적으로 처리할 수 없어 실행에 실패하거나 실행 상태를 유지할 수 없습니다. Python 프로그래머는 애플리케이션이 사용자 또는 자체 코드에 의해 발생할 수 있는 오류에 대응할 수 있는지 확인해야 합니다.

이는 까다로울 수 있지만 다행히도 파이썬에는 이를 조금 더 쉽게 만들어주는 문이 있습니다. 이 문은 프로그램이 오류를 처리하는 데 도움이 될 뿐만 아니라 코드를 훨씬 더 깔끔하고 읽기 쉽게 만드는 역할을 하며, 더 복잡한 try/finally 문을 대체합니다.

try/finally 문을 사용하는 간단한 예제를 살펴보고, 이어서 with를 사용하여 동일한 애플리케이션을 시연해 보겠습니다. 이 애플리케이션은 새 파일을 생성하고 "Hello New Stack"이라는 텍스트를 작성합니다. 이 작업을 수행하기 위해 open(), write(), close() 함수를 사용합니다. 각 함수는 표준 라이브러리에서 사용할 수 있으므로 아무것도 가져올(import) 필요가 없습니다.

 

try / finally 구문

여기에서 사용되는 try /finally 구문은 다음과 같습니다.

file = open('test_file', 'w')
try:
    file.write('Hello New Stack')
finally:
    file.close()

 

설명

  • file = open('test_file', 'w'): 쓰기 권한이 있는 test_file 이라는 새 파일을 생성하여 파일 변수를 정의합니다.
  • try: Python에 오류가 있는지 코드 블록을 테스트할 것이라고 알려줍니다.
  • file.write('Hello New Stack'): 변수에 의해 정의된 파일에 Hello New Stack을 쓰겠다고 Python에 지시합니다.
  • finally: 오류 테스트 중인 코드 블록을 종료합니다.
  • file.close(): test_file을 닫습니다.

 

선택한 편집기(이름을 tryfinally.py로 지정)를 사용하여 해당 파일을 만들고 다음을 사용하여 실행합니다.

<i><span style="font-weight: 400;">python3 tryfinally.py</span></i>

 

출력이 표시되지 않아야 하지만 test_file 의 내용을 보면 다음과 같아야 합니다.

<i><span style="font-weight: 400;">Hello New Stack</span></i>

 

with 구문

이번에는 with 문을 사용하여 똑같은 일을 해 봅니다. 다음과 같은 두 줄만 사용하여 이 작업을 수행할 수 있습니다.

with open("test_file", "w") as file:
    file.write("Hello New Stack")

 

설명

  • open("test_file", "w") as file: 쓰기를 위해 test_file을 연 다음, 쓰기 프로세스가 끝나면 자동으로 닫습니다.
  • file.write("Hello New Stack"): 따옴표 안에 있는 내용을 test_file에 씁니다.

 

이 프로그램을 실행하면 try/finally 문을 사용한 앱에서와 동일한 결과를 볼 수 있습니다. 차이점은 오류 처리를 더 깔끔하고 효율적으로 사용할 수 있었다는 점입니다. try/finally를 사용하는 것이 잘못된 것은 아니지만, 파이썬의 목표는 더 쉽게 읽을 수 있는 더 깔끔한 코드를 작성하는 것입니다. 더 적은 코드 줄을 사용하면 오류가 발생할 가능성이 줄어듭니다.

with의 진정한 장점은 파일 열기 및 닫기와 같이 더 많은 코드가 필요한 작업을 처리할 수 있다는 점입니다. 물론 with는 open()에서만 작동하는 것은 아닙니다. with를 지원하는 객체를 만들 수도 있습니다. with를 사용하는 파일 쓰기용 객체를 만들어 보겠습니다. 위에서 한 것과 동일한 작업(Hello World를 test_file에 쓰기)을 수행하되, 이번에는 with를 사용하는 객체를 만들어서 수행하겠습니다.

 

몇 가지 주목해야 할 사항이 있습니다.

  • class: 객체를 만들기 위한 코드 템플릿 역할을 합니다.
  • def: 함수를 정의하는 데 사용되는 키워드입니다.
  • __init__: 새로 생성된 객체를 초기화합니다.
  • __enter__: 반환값이 with 대상 변수에 바인딩됩니다.
  • __exit__: 코드 블록 내에서 발생할 수 있는 특수한 경우를 처리합니다.


코드는 다음과 같습니다.

class TextWriter(object):
    def __init__(self, file_name):
        self.file_name = file_name
    def __enter__(self):
        self.file = open(self.file_name, 'w')
        return self.file
   def __exit__(self, *args):
        self.file.close()

 with TextWriter('test_file') as tfile:
   tfile.write('Hello New Stack')

 

설명

  • class TextWriter(객체): 클래스(TextWriter)의 이름을 객체로 지정합니다.
  • def __init__(self, file_name): 객체를 초기화하고 file_name 변수에 접근할 수 있게 합니다.
  • self.file_name = file_name: self.file_name을 file_name으로 정의합니다.
  • def __enter__(self): (self가 정의한 대로) file_name에 바인딩합니다.
  •  self.file = open(self.file_name, 'w'): 파일이 쓰기 권한으로 열렸는지 확인합니다.
  • return self.file: 원래 호출자에게 결과를 반환합니다.
  • def __exit__(self, *args): *args를 사용하여 함수에 가변적인 수의 인수를 전달합니다.
  • self.file.close(): 열린 파일을 닫습니다.
  • with TextWriter('test_file') as tfile: with 문을 사용하여 TextWriter 객체의 오류를 처리하고, 이를 tfile로 정의하고, 쓰기를 위해 test_file을 연 다음, write() 함수가 작업을 완료하면 닫습니다.
  • tfile.write('Hello New Stack'): Hello New Stack을 tfile에 씁니다.

 

프로그램을 실행하면 이전과 동일한 출력이 표시됩니다(Hello 새 스택이 test_file에 기록됨).

With는 파이썬 오류 처리를 위한 매우 강력하고 편리한 도구입니다. try/finally 메서드를 보다 간결한 코드 블록으로 대체하면 프로그램이 리소스를 사용한 후 안정적으로 종료할 수 있을 뿐만 아니라 오류 발생이 적은 깔끔한 코드를 작성할 수 있습니다.

 

Excel과 VBA의 모든 것 아이엑셀러 닷컴 · 강사들이 숨겨 놓고 보는 엑셀러TV