티스토리 뷰

IT/Python

[Python] 예외 처리

Dragonz 2020. 8. 2. 01:22
반응형

 

아래 프로그램은 올바른 정수가 입력될 때 까지 사용자에게 입력을 요청한다.

>>> while True :
...     try :
...         x = int(input("숫자를 입력하세요 : "))
...         break
...     except ValueError :
...         print("숫자가 아닙니다. 다시 입력해주세요 : ")
...
숫자를 입력하세요 : a
숫자가 아닙니다. 다시 입력해주세요 :
숫자를 입력하세요 : 1
>>>                                

 

숫자가 입력되지 않았을 때의 예외처리

 

try 문은  다음과 같이 동작한다.

  • 먼저 try 절이 실행된다.
  • 예외가 발생하지 않으면 except 절을 건너뛰고 try 문의 실행은 종료된다.
  • try 절을 실행하는 동안 예외가 발생하면, 절의 남은 부분을 건너뛴다. except 키워드 뒤에 오는 예외 이름과 매치되면, 해당 except 절이 실행되고, 그 후 실행은 try 문 뒤로 이어진다.
  • except 절에 있는 예외 이름들과 매치되지 않는 예외가 발생하면 외부에 있는 try 문으로 전달된다. 처리기가 발견되지 않으면 처리되지 않은 예외이고 위에서 보인 것과 같은 메시지를 출력하면서 실행이 멈춘다.

각기 다른  예외 처리를 지정하기 위해 try 문은 하나 이상의 except 절을 가질 수 있다. 처리기는 해당하는 try 절에서 발생한 예외만 처리할 뿐 같은 try 문의 다른 처리기가 일으킨 예외를 처리하지 않는다. 마지막 except 절은 예외 이름을 생략할 수 있는데, 와일드 카드 역할을 한다.

>>> try :
...     f = open('myfile.txt')
...     s = f.readline()
...     i = int(s.strip())
... except OSError as err:
...     print("OS error: {0}".format(err))
... except ValueError:
...     print("Could not convert data to an integer.")
... except:
...     print("Unexpected error:", sys.exc_info()[0])
...     raise
...
OS error: [Errno 2] No such file or directory: 'myfile.txt'

 

여러개의 except 절로 예외 처리

 

try ... except 문은 선택적인 else 절을 갖는데, else 절은 모든 except 절 뒤에 와야 한다. try 절이 예외를 일으키지 않을 때 실행되어야 하는 코드에 유용하다.

# test.py
import sys

try :
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as err:
    print("OS error: {0}".format(err))
except ValueError:
    print("Could not convert data to an integer.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise

 

myfile.txt 가 존재하지 않을 때 예외 처리
파일의 내용이 int 형으로 변환되지 않을 때 예외 처리

 

except 절은 예외 이름 뒤에 변수를 지정할 수 있다. 변수는 인자들이 instance.args 에 저장된 예외 인스턴스에 연결된다. 예외를 일으키기 전에 인스턴스를 먼저 만들고 필요한 속성들을 추가할 수도 있다.

>>> try :
...     raise Exception('spam', 'eggs')
... except Exception as inst :
...     print(type(inst))    # the exception instance
...     print(inst.args)     # arguments stored in .args
...     print(inst)          # __str__ allows args to be printed directly,
...                          # but may be overridden in exception subclasses
...     x, y = inst.args     # unpack args
...     print('x =', x)
...     print('y =', y)
...
<class 'Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs

 

예외처리와 변수

 

try 문은 또 다른 선택적 절을 가질 수 있는데 모든 상황에 실행되어야 하는 후속 동작을 정의하는데 사용된다.

>>> try:
...     raise KeyboardInterrupt
... finally:
...     print('Goodbye, world!')
...
Goodbye, world!
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

 

try ... finally 절

 

finally 절이 있으면 try 문이 완료되기 전에 finally 절이 마지막 작업으로 실행된다. finally 절은 try 문이 예외를 생성하는지와 상관 없이 실행된다. 다음은 예외가 발생할 때 더 복잡한 경우를 설명한다.

  • try 절을 실행하는 동안 예외가 발생하면, except 절에서 예외를 처리할 수 있다. 예외가 except 절에서 처리되지 않으면 finally 절이 실행된 후 예외가 다시 발생한다.
  • except 나 else 절 실행 중에 예외가 발생할 수 있다. 다시 finally 절이 실행된 후 예외가 발생한다.
  • try 문이 break, continue 또는 return 문에 도달하면 finally 절은 break, continue 또는 return 문 실행 직전에 실행된다.
  • finally 절에 return 문이 포함되면 반환 값은 try 절의 return 문이 주는 값이 아니라 finally 절의 return 문이 주는 값이 된다.

 

 

END

반응형

'IT > Python' 카테고리의 다른 글

[Python] 함수 프로그램  (0) 2020.09.11
[Python] 예외 처리 프로그램  (0) 2020.09.11
[Python] 파일 읽고 쓰기  (0) 2020.08.01
[Python] 출력  (0) 2020.08.01
[Python] 모듈  (0) 2020.08.01
댓글
공지사항