Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python
Code

파이썬에서 디버깅하기

by
Difficulty:BeginnerLength:ShortLanguages:

Korean (한국어) translation by Dae-yeop Lee (you can also view the original English article)

'디버깅(debugging)'이라는 표현은 '버그(bug, 벌레)'가 있을지도 모른다는 것을 의미합니다. 여기서 말하는 버그란 집 안에서 발견할 수도 있는 벌레가 아니라 프로그래밍 버그를 의미합니다!

이번 강좌를 더 진행하기에 앞서 몇 가지 용어를 정리하겠습니다. 버그디버깅의 의미를 간략하게 정의해 봅시다.

버그

컴퓨터 업계에서 버그는 소프트웨어와 하드웨어에서 모두 발생할 수 있지만 여기서 초점을 두는 것은 소프트웨어에서 발생할 수 있는 버그입니다. 버그라는 용어의 유래에 대해 간략하게 언급하겠습니다. 컴퓨터 업계에서 버그라는 용어가 최초로 사용된 것은 실제 벌레(나방)가 마크 II라는 컴퓨터의 계전기에서 발견됐을 때라고 알려져 있습니다. 버그라는 용어는 19세기 말에 기술적인 결함을 묘사할 때 사용되기도 했습니다.

소프트웨어 버그는 프로그램이 의도하지 않은 동작을 하게끔 만듭니다. 버그라는 용어는 어디에서 어떻게 발생했는지 모르는 오류(error)를 가리킬 때 널리 사용되는 용어이며 심각한 문제(예: 프로그래밍 충돌)를 일으킬 수 있습니다.

이 같은 상황에서 디버깅(debugging)이 빛을 발합니다.

디버깅

혹자는 문제를 방지하는 가장 좋은 방법은 애시당초 버그를 만들어내지 않는 것이라고 말하기도 합니다. 하지만 안타깝게도 이렇게 되는 경우는 거의 없으며, 처음부터 문제가 없는 깨끗한 프로그램을 만들기란 쉬운 일이 아닙니다. 버그가 있다는 것은 누구나 겪을 법한 아주 일반적인 상황입니다.

디버깅은 버그(오류)가 발생한 위치를 파악해서 분석한 후 올바르게 고치는 과정입니다. 디버깅의 궁극적인 목표는 그러한 버그를 제거하고 의도한 바대로 실행되고 동작하는 프로그램을 만드는 데 있습니다. 여기서 한 가지 알아둬야 할 중요한 점은 디버깅할 때 대부분의 시간을 버그가 어디에서 발생하는지 파악하는 데 보낸다는 것인데, 그 이유는 앞에서 이야기한 바와 같이 버그가 미처 알지 못하는 곳에서 발생하기 때문입니다.

디버깅이 얼마나 어려워질 수 있는지 감을 잡을 수 있게 브라이언 W. 커닝헌이 했던 말을 들어봅시다.

원래 디버깅이 프로그램을 짜는 것보다 두 배나 어렵다는 사실은 누구나 알 것입니다. 그러니 여러분이 프로그램을 작성할 수 있을 만큼 똑똑하다면 프로그램을 디버깅하려면 도대체 얼마나 똑똑해야겠습니까?

파이썬 예외 처리

예외(exception)는 버그(오류)가 있음을 나타내는 객체입니다. 다시 말해 파이썬에서는 프로그램에 버그가 있다는 것을 알려주기 위해 객체를 이용합니다. 이는 디버깅 과정에서 위치 파악 부분에 해당합니다. 예외 객체를 받아 해당 버그를 처리하는 데 필요한 행동을 수행하는 것을 예외 처리(handling)라고 합니다. 이는 디버깅 과정에서 각각 분석수정 단계에 해당합니다.

try 문

파이썬의 try 문은 예외를 처리하는 데 사용되며 try/excepttry/finally의 두 가지 형태가 있습니다. 첫 번째 경우에는 try 절에 이어 하나 또는 그 이상의 except 절이 나오고, 두 번째 경우에는 단 하나의 finally 절만 나옵니다.

try/except

try/except 문법은 다음과 같습니다.

try 절의 본문에는 예외를 발생시킬 수도 있는 코드가 담깁니다. 이때 예외가 발생하면 블록 내의 모든 구문은 건너뜁니다. 한편으로 except 절의 본문은 예외 처리자(exception handler)라고 하는데 예외를 잡는 데 사용되기 때문입니다. except 블록의 코드는 예외가 발생한 경우에만 실행되며, 그 밖의 경우에는 실행되지 않습니다. 파이썬 표준 라이브러리에 기본적으로 내장된 예외를 사용할 수도 있습니다.

좀 더 명확하게 이해할 수 있게 예제를 살펴봅시다. 나눗셈 식에서 분모를 사용자에게 입력받는다고 해봅시다. 0으로 나누는 것은 허용되지 않으므로 0으로 나누는지 검사한 후 이 오류가 발생할 경우 메시지를 출력하는 try/except 문을 작성해 봅시다.

예를 들어, 값으로 5를 입력할 경우 출력 결과는 다음과 같습니다.

이제 입력으로 0을 입력해 봅시다. 이 경우 어떤 내용이 출력될까요?

try/finally

try/finally는 파이썬에서 try 문을 작성하는 또 한 가지 방법입니다. finally 절은 정리/종료(clean-up/termination) 절이라고도 하는데, try 블록에서 예외가 발생했는지 여부와 관계없이 항상 실행되어야 하기 때문입니다.

이번에는 앞절의 예제에 finally 절을 사용해 봅시다.

예를 들어, 값으로 5를 입력하면 다음과 같이 출력됩니다.

raise 키워드

raise 키워드는 파이썬에서 예외를 처리하는 또 한 가지 방법입니다. 이 경우 예외를 직접 일으킬 수 있습니다. 즉, 예상되는 오류 범위 밖에서 문제가 발생했을 때 예외를 발생시키는 것을 의미합니다.

개념을 좀 더 이해하기 위해 raise 키워드를 사용하는 예제를 살펴봅시다.

이 예제에서 허용된 범위를 넘어서는 숫자를 입력하면 except 블록의 print 문이 실행될 것입니다.

직접 예제를 실행해 값을 입력하고 결과를 확인해 보십시오.

traceback 모듈

파이썬의 traceback 모듈은 파이썬에서 예외를 처리하는 또 한 가지 방법입니다. 이 모듈은 예외가 발생한 후 프로그램의 스택 트레이스(stack trace)를 출력하는 데 사용됩니다. traceback에는 오류 메시지, 오류를 일으킨 줄 번호, 오류까지 이어지는 함수 호출 순서를 나타내는 호출 스택(call stack)이 들어 있습니다.

traceback을 생성하는 예제를 살펴봅시다.

이 스크립트를 실행하면 다음과 같은 출력 결과가 나타납니다.

여기서 버그(오류)가 createException 함수의 2번째 줄에서 발생한 것을 눈여겨보십시오. 아울러 호출 스택을 통해 어떤 함수 호출이 오류를 일으켰는지 파악할 수 있으며, 이 경우 4번째 줄에서 일어난 함수 호출에 해당합니다.

강좌가 점점 길어지고 있으므로 이번 강좌는 여기까지만 하겠습니다. 지금까지 보셨다시피 프로그램을 디버깅하는 것은 아주 자연스럽고 평범한 일이며, 이번 강좌에서 보신 오류 유형에 이미 익숙하실 거라고 생각합니다.

파이썬 프로그램을 디버깅하고 예외를 처리하는 방법으로는 이것 말고도 더 있습니다. 예를 들면, 잘 알려진 방법으로 assert statement가 있지요.

그럼 즐거운 디버깅 되시길!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.