본문 바로가기
IT/파이썬 기초 (Python)

#038 파이썬 기초 - 예외 처리 I

by DoitSQL 2023. 3. 21.
728x90

Python기초강의강좌, 파이썬기초강의강좌, 예외처리

#038 파이썬 기초 - 예외 처리 I

예외 처리 I

예외란 말 그대로 프로그램에서 벌어지는 예외적인 상황을 뜻합니다. 예를 들자면 여러분이 파일을 읽고자 할 때 그 파일이 존재하지 않는 경우라던지, 또는 프로그램이 한참 실행 중인데 그 파일을 갑자기 지워버렸다던지 하는 경우 등입니다. 이러한 상황을 처리해 주는 것을 예외 처리 라고 합니다.

 

비슷하게 여러분의 프로그램에 존재하지 않는 명령문이 있을 경우 어떻게 될까요? 이런 경우 파이썬은 손을 들고(raise) 프로그램에 오류(error)가 있다고 알려 줍니다.


문법 에러

문법 에러는, 파싱 에러라고도 알려져 있습니다, 아마도 여러분이 파이썬을 배우고 있는 동안에는 가장 자주 만나는 종류의 에러일 것입니다:

>>> while True print('Hello world')
  File "<stdin>", line 1
    while True print('Hello world')
               ^
SyntaxError: invalid syntax

파서는 문제가 되는 줄을 다시 보여주고 줄에서 에러가 감지된 가장 앞의 위치를 가리키는 작은 ‘화살표’를 표시합니다. 에러는 화살표 앞에 오는 토큰이 원인입니다 (또는 적어도 그곳에서 감지되었습니다). 이 예에서, 에러는 함수 print()에서 감지되었는데, 그 앞에 콜론 (:) 이 빠져있기 때문입니다. 파일 이름과 줄 번호가 인쇄되어서, 입력이 스크립트로부터 올 때 찾을 수 있도록 합니다.


예외

문장이나 표현식이 문법적으로 올바르다 할지라도, 실행하려고 하면 에러를 일으킬 수 있습니다. 실행 중에 감지되는 에러들을 예외라고 부르고 무조건 치명적이지는 않습니다. 파이썬 프로그램에서 이것들을 어떻게 다루는지 곧 배우게 됩니다. 하지만 대부분의 예외는 프로그램이 처리하지 않아서, 여기에서 볼 수 있듯이 에러 메시지를 만듭니다.

>>> 10 * (1/0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ZeroDivisionError: division by zero
>>> 4 + spam*3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'spam' is not defined
>>> '2' + 2
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate str (not "int") to str

에러 메시지의 마지막 줄은 어떤 일이 일어났는지 알려줍니다. 예외는 여러 형으로 나타나고, 형이 메시지 일부로 인쇄됩니다. 이 예에서의 형은 ZeroDivisionError, NameError, TypeError입니다. 예외 형으로 인쇄된 문자열은 발생한 내장 예외의 이름입니다. 줄의 나머지 부분은 예외의 형과 원인에 기반을 둔 상세 명세를 제공합니다. 에러 메시지의 앞부분은 스택 트레이스의 형태로 예외가 일어난 위치의 문맥을 보여줍니다. 일반적으로 소스의 줄들을 나열하는 스택 트레이스를 포함하고 있습니다.


예외 처리

예외는 try.. except 문을 통해 처리할 수 있습니다. 이것은 try 블록 안에 평소와 같이 명령을 입력하고 예외 상황에 해당하는 오류 핸들러를 except 블록에 입력해 주면 됩니다.

 

예제 ( exceptions_handle.py로 저장하세요 )

# Filename : exceptions_handle.py
try:
    numerator = int(input("Enter the numerator: "))
    denominator = int(input("Enter the denominator: "))
    result = numerator / denominator
    print("Result: ", result)
except ValueError:
    print("Invalid input. Please enter integer values.")
except ZeroDivisionError:
    print("Cannot divide by zero.")
except EOFError:
    print('Why did you do an EOF on me?')
else:
    print("Thank you for using the program.")

▶ 실행 결과:

# 정상
C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_handle.py
Enter the numerator: 10
Enter the denominator: 2
Result:  5.0
Thank you for using the program.

# ValueError
C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_handle.py
Enter the numerator: a
Invalid input. Please enter integer values.

# ZeroDivisionError
C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_handle.py
Enter the numerator: 5
Enter the denominator: 0
Cannot divide by zero.

# EOFError
C:\Anaconda\envs\study_39\python.exe E:\python_study\exceptions_handle.py
Enter the numerator: ^D
Why did you do an EOF on me?

▶ 동작 원리:

이 예제에서 사용자는 분자와 분모에 대해 두 개의 정수 값을 입력하라는 메시지를 받습니다.

 

예외가 발생할 수 있는 모든 명령문을 try 블록에 넣어 주었으며 오류/예외를 적절하게 처리해 줄 핸들러를 except 절/블록에 넣어 주었습니다. except 절에서는 지정된 한 개의 오류 혹은 예외를 처리할 수도 있고, 괄호로 묶인 모

 

든 오류/예외 목록을 처리해 줄 수도 있습니다. 만일 오류/예외가 지정되지 않은 경우에는 모든 오류/예외를 처리하게 됩니다. 이때 모든 try 절에는 적어도 한 개의 except 절이 있어야 합니다. 아니면 try 블록을 사용할 아무런 이유가 없겠지요?

 

만약 어떤 오류나 예외든지 이처럼 처리되지 않는 경우, 기본 파이썬 오류 핸들러가 호출되는데 그러면 이에 의해 프로그램의 수행이 중단되며 해당하는 오류 메시지가 출력됩니다. 위에서 기본 파이썬 오류 핸들러가 어떻게 동작하는지 보았습니다.

 

또한 try.. except 블록에는 추가로 else 절을 붙여줄 수 있습니다. else 절은 어떤 예외도 발생하지 않았을 경우 호출됩니다.


다음 시간에 예외 처리에 대해서 더 알아보도록 합니다.

감사합니다.

Do it! SQL을 찾아 주셔서 감사합니다. ♥ 댓글이 큰 힘이 됩니다.

 

728x90

댓글