신규 블로그를 만들었습니다!

2020년 이후부터는 아래 블로그에서 활동합니다.

댓글로 질문 주셔도 확인하기 어려울 수 있습니다.

>> https://bluemiv.tistory.com/

 

 

 

이전글...

 

2018/01/06 - [Language/Python] - Python :: 파일 입출력(file IO), 읽고쓰기에 대해서 알아보자#11

 

 

 

이번에는 예외처리에 대해 알아보겠습니다.

 

우리는 종종 프로그램실행도중 에러로 인해 실행 중단 되는 경우가 발생합니다.

 

예를 들어, 3 / 0 처럼 0으로 나눌수가 없기 때문에, 컴퓨터는 이 부분에서 에러를 발생시킵니다.

 

이때 발생하는 에러는 ZeroDivisionError 로 0으로 나눌수 없는 에러라는 것 입니다.

 

그렇다면, 이러한 에러가 발생했을때 프로그램이 중단되는것이 아니라 계속해서 다음 코드가 실행되도록 하고 싶을때는 어떻게 해야할까요?

 

바로 예외처리입니다.

 

형태는

 

try 

실행할 코드

except :

try에서 예외 발생시 실행할 코드

 

 

위와 같은 형태가 기본 형태 입니다.

 

예제를 살펴보겠습니다.

 

1. 기본

 

def my_div(num1, num2):
    return num1 / num2
 
# step1. 기본 try ~ except
try:
    print(my_div(2, 1))
    print('complete')
    print(my_div(2, 0)) # 예외 발생
    print('complete')
except:
    print('0 으로 나눌 수 없습니다.')

 

결과값 >>

2.0

complete

0 으로 나눌 수 없습니다.

 

 

나누기 함수를 하나 만들어서, 정상적인 값을 넣었을때와 0으로 나누는값을 넣었을때 어떻게 다른지 살펴보겠습니다.

 

보시는 것과 같이, 2/1 의 경우 2.0 정상적으로 나오고 그 다음 줄의 complete 라는 말까지 잘 출력이됩니다.

 

그 이후 2/0과 같이 0으로 나누려고 하자, 예외를 발생시켜 except문으로 빠지는것을 확인 할 수 있습니다.

 

그리고 9번째 중 print('complete') 는 실행되지 않는 것을 확인 할 수 있습니다.

 

 

2. 각 예외에 따른 다른 예외처리

 

예외에도 종류가 여러가지로 굉장히 많이 있습니다.

 

예외마다 다른 코드를 실행해 각각 다르게 예외처리를 하고 싶을때는 except 뒤에 에러객체를 쓰고 계속해서 추가하면 됩니다.

 

try : 

실행할 코드

except 예외내용:

try에서 예외 발생시 실행할 코드

except 예외내용:

try에서 예외 발생시 실행할 코드

except 예외내용:

try에서 예외 발생시 실행할 코드

....

try:
    print(my_div(2, 1))
    print('complete')
    print(my_div(2, 'hello'))  # 예외 발생
    print('complete')
except ZeroDivisionError:
    print('zero division error~!')
    print('0 으로 나눌 수 없습니다.')
except TypeError as e: # 'e' 라는 변수에 값을 담아서 예외 메세지를 출력할 수 있다.
    print('Type Error~! /', e)
    print('숫자를 넣어주세요')

 

결과값 >>

2.0

complete

Type Error~! / unsupported operand type(s) for /: 'int' and 'str'

숫자를 넣어주세요

 

이번에는 0으로 나누는것이 아니라, 숫자를 문자로 나누는 경우

 

즉, 상식적으로 불가능한 연산을 실행해보도록 하겠습니다.

 

이러한경우에는 TypeError 가 발생합니다.

 

그래서 ZeroDivisionError가 아닌 TypeError로 이동해서 해당 except 구문을 실행합니다.

 

 

예외에 대해서 좀 더 자세한 내용을 보고 싶을때는 as 를 이용하면 됩니다.

 

 

...

...

except 예외내용 as 임의의변수:

try에서 예외 발생시 실행할 코드

....

 

 

print() 함수를 이용해서 e를 출력하면, 에러에 대한 자세한 내용을 출력하게 됩니다.

 

 

3. 모든 예외처리

 

step 2에서 배운 내용과 똑같습니다.

 

모든 예외를 처리하고 싶을때는 BaseException을 사용 하시면 됩니다.

try:
    print(my_div(2, 1))
    print('complete')
    print(my_div(2, 0)) # 예외 발생
    print('complete')
except BaseException as e:  # 모든 예외처리를 해줌
    print('0 으로 나눌 수 없습니다. /', e)

 

결과값 >>

2.0

complete

0 으로 나눌 수 없습니다. / division by zero

 

 

4. finally

 

try:

실행할 코드

except :

예외 발샐시 실행할 코드

finally :

예외가 발생하든 안하든 무조건 실행하는 코드

 

예외가 발생하든 발생안하든

 

try except 문을 실행후에 꼭 실행하고 싶은 코드가 있을때는 finally를 이용합니다.

# 예외 발생 o
try:
    print(my_div(2, 0))
except:
    print('0 으로 나눌 수 없습니다.')
finally:
    print('이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.')
 
print('==============')
 
# 예외 발생 x
try:
    print(my_div(2, 1))
except:
    print('0 으로 나눌 수 없습니다.')
finally:
    print('이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.')

 

결과값 >>

0 으로 나눌 수 없습니다.

이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.

==============

2.0

이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.



첫번째는 예외가 발생했을때, 두번째는 예외가 발생하지 않았을때

 

모두 finally 문의 코드를 실행한 것을 확인 할 수 있습니다.

 

5. else

 

else는 finally와는 다르게 예외가 발생하지 않았을경우에만 실행됩니다.

# 예외 발생가 발생하지 않았을때만 실행하는 else
try:
    print(my_div(2, 1))
except:
    print('0 으로 나눌 수 없습니다.')
else:
    print('에러가 발생하지 않았을때만 실행이 됩니다.')
finally:
    print('이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.')

 

결과값 >>

2.0

에러가 발생하지 않았을때만 실행이 됩니다.

이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.

 

에러가 발생하는 경우에는 위의 결과값과 다르게 else문은 실행되지 않고, 출력되는것을 확인 할 수 있습니다.

try:
    print(my_div(2, 0))
except:
    print('0 으로 나눌 수 없습니다.')
else:
    print('에러가 발생하지 않았을때만 실행이 됩니다.')
finally:
    print('이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.')

 

결과값 >>

0 으로 나눌 수 없습니다.

이부분은 예외가 발생하든 발생안하든 무조건 실행됩니다.

 

 

6. 예외의 종류

 

예외의 종류에는 여러개가 참 많습니다.

 

이중에서 필요하면 골라서 사용 하실 수 있습니다.

 

이번 글에서 예제로 썼던 예외는 두꺼운글씨로 표시 했습니다.

 

BaseException

 +-- SystemExit

 +-- KeyboardInterrupt

 +-- GeneratorExit

 +-- Exception

      +-- StopIteration

      +-- StopAsyncIteration

      +-- ArithmeticError

      |    +-- FloatingPointError

      |    +-- OverflowError

      |    +-- ZeroDivisionError

      +-- AssertionError

      +-- AttributeError

      +-- BufferError

      +-- EOFError

      +-- ImportError

           +-- ModuleNotFoundError

      +-- LookupError

      |    +-- IndexError

      |    +-- KeyError

      +-- MemoryError

      +-- NameError

      |    +-- UnboundLocalError

      +-- OSError

      |    +-- BlockingIOError

      |    +-- ChildProcessError

      |    +-- ConnectionError

      |    |    +-- BrokenPipeError

      |    |    +-- ConnectionAbortedError

      |    |    +-- ConnectionRefusedError

      |    |    +-- ConnectionResetError

      |    +-- FileExistsError

      |    +-- FileNotFoundError

      |    +-- InterruptedError

      |    +-- IsADirectoryError

      |    +-- NotADirectoryError

      |    +-- PermissionError

      |    +-- ProcessLookupError

      |    +-- TimeoutError

      +-- ReferenceError

      +-- RuntimeError

      |    +-- NotImplementedError

      |    +-- RecursionError

      +-- SyntaxError

      |    +-- IndentationError

      |         +-- TabError

      +-- SystemError

      +-- TypeError

      +-- ValueError

      |    +-- UnicodeError

      |         +-- UnicodeDecodeError

      |         +-- UnicodeEncodeError

      |         +-- UnicodeTranslateError

      +-- Warning

           +-- DeprecationWarning

           +-- PendingDeprecationWarning

           +-- RuntimeWarning

           +-- SyntaxWarning

           +-- UserWarning

           +-- FutureWarning

           +-- ImportWarning

           +-- UnicodeWarning

           +-- BytesWarning

           +-- ResourceWarning

 

 

 

다음글...

 

2018/01/10 - [Language/Python] - Python :: 파이썬 예외 발생시키기 (raise Exception) #13

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기