Wisdom’s Cloud

[PYTHON] 10. 예외 처리 본문

PYTHON

[PYTHON] 10. 예외 처리

지혜로운지혜쓰 2021. 2. 24. 18:00
예외 처리
  • 프로그램을 만들다 보면 수없이 많은 오류를 만나게 된다. 물론 오류가 발생하는 이유는 프로그램이 잘못 동작하는 것을 막기 위한 파이썬의 배려이다.

  • 하지만 때때로 이러한 오류를 무시하고 싶을 때도 있다. 이를 위해 파이썬은 try, except를 사용해서 예외적으로 오류를 처리할 수 있게 해준다. 

 

 

  • 오류 예외 처리 기법

# try, excetp문
# try, excetp만 쓰는 방법(오류 종류에 상관없이 오류가 발생하면 except 블록을 수행한다.)
try:
   ...
except:
   ...
   
# 발생 오류만 포함한 except문(오류가 발생했을 때 except문에 미리 정해 놓은 오류 이름과 일치할 때만 except 블록을 수행한다.)
try:
   ...
except 발생 오류:
   ...

# 발생 오류와 오류 메시지 변수까지 포함한 except문(두 번째 경우에서 오류 메시지의 내용까지 알고 싶을 때 사용하는 방법이다.)
try:
   ...
except 발생 오류 as 오류 메시지 변수:
   ...
   
# 예시(4를 0으로 나누려고 하면 ZeroDivisionError가 발생하여 except 블록이 실행되고 변수 e에 담기는 오류 메시지를 출력한다.)
try:
   4 / 0
except ZeroDivisionError as e:
   print(e)
   
   
# try ... finally
f = open('foo.txt', 'w')
try:
   # 무언가를 수행한다.
finally:
   f.close()
# finally절은 try문 수행 도중 예외 발생 여부에 상관없이 항상 수행된다.
# 보통 finally절은 사용한 리소스를 close해야 할 때 많이 사용한다.


# 여러 개의 오류 처리하기
try:
   a = [1, 2]
   print(a[3])
   4/0
except (ZeroDivisionError, IndexError) as e:
   print(e)
# 2개 이상의 오류를 동시에 처리하기 위해서는 위와 같이 괄호를 사용하여 함께 묶어 처리하면 된다.

 

  • 오류 회피하기

# 프로그래밍을 하다 보면 특정 오류가 발생할 경우 그냥 통과시켜야 할 때가 있다.
try:
   f = open("나없는파일", 'r')
except FileNotFoundError:
   pass
# try문 안에서 FileNotFoundError가 발생할 경우에 pass를 사용하여 오류를 그냥 회피하도록 작성한 예제이다.

 

  • 오류 일부러 발생시키기

# 프로그래밍을 하다 보면 종종 오류를 일부러 발생시켜야 할 경우도 생긴다.
# 파이썬은 raise 명령어를 사용해 오류를 강제로 발생시킬 수 있다.
# Bird 클래스를 상속받는 자식 클래스는 반드시 fly라는 함수를 구현하도록 만들어 보자.
class Bird:
   def fly(self):
      raise NotImplementedError
class Eagle(Bird):
   pass
eagle = Egle()
eagle.fly()
# Eagle 클래스는 Bird 클래스를 상속받는다. 그런데 Eagle 클래스에서 fly 함수를 구현하지 않았기 때문에
# Bird 클래스의 fly 함수가 호출되고, raise문에 의해 NotImplemented Error가 발생한다.
# NotImplementedError가 발생되지 않게 하려면 다음과 같이 Eagle 클래스에 fly 함수를 반드시 구현해야 한다.
class Eagle(Bird):
   def fly(self):
      print("very fast")
eagle = Egle()
eagle.fly()

 

  • 예외 만들기

# 예외는 다음과 같이 파이썬 내장 클래스인 Exception 클래스를 상속하여 만들 수 있다.
class MyError(Exception):
   pass
   
# 그리고 별명을 출력해 주는 함수를 다음과 같이 작성한다.
def say_nick(nick):
   if nick == '바보':
      raise MyError()
   print(nick)
   
# 그리고 다음과 같이 say_nick 함수를 호출해보면, '천사'가 한 번 출력된 후 MyError가 발생한다.
say_nick("천사")
sya_nick("바보")

# 이번에는 예외 처리 기법을 사용하여 MyError 발생을 예외 처리해 보면, '천사'와 '허용되지 않는 별명입니다.'가 출력된다.
try:
   say_nick("천사")
   say_nick("바보")
except MyError:
   print("허용되지 않는 별명입니다.")
   
# 만약 오류 메시지를 사용하고 싶다면 다음처럼 예외 처리를 하면 된다.
# 하지만 프로그램을 실행해 보면 print(e)로 오류 메시지가 출력되지 않는 것을 확인할 수 있다.
try:
   say_nick("천사")
   say_nick("바보")
except MyError as e:
   print(e)
   
# 오류 메시지를 출력했을 때 오류 메시지가 보이게 하려면 오류 클래스에 다음과 같은 __str__ 메서드를 구현해야 한다.
# __str__ 메서드는 print(e)처럼 오류 메시지를 print문으로 출력할 경우에 호출되는 메서드다.
class MyError(Exception):
   def __str__(self):
      return "허용되지 않는 별명입니다."

'PYTHON' 카테고리의 다른 글

[PYTHON] 12. 외장 함수  (0) 2021.02.25
[PYTHON] 11. 내장 함수  (0) 2021.02.25
[PYTHON] 9. 패키지  (0) 2021.02.24
[PYTHON] 8. 모듈  (0) 2021.02.24
[PYTHON] 7. 클래스  (0) 2021.02.24