프로그래밍 언어/파이썬

파이썬 30. 예외 처리

닉네임못짓는사람 2020. 11. 30. 06:32
반응형

이번 글에서는 예외 처리에 대해서 알아보도록 하겠습니다.

예외 처리


지금까지 파이썬에 대해 알아보면서, 또는 파이썬으로 프로그램을 만들면서 우리들은 많은 오류 메시지들을 봐왔습니다.

이런 오류들을 보는것은 프로그래머라면 매우 당연하고, 중요한 일일 것입니다.

그런데 어떤 때에는 의도적으로 이 오류에 대해서 특정한 작업을 수행하고 싶은 경우가 생기는데,

파이썬에선 이러한 예외 처리를 위해 try~except를 지원하고 있습니다.

 

일단 간단한 오류를 한 번 발생시켜봅시다.

print(a)

간단하게 선언하지 않은 변수 a를 출력하도록 하여 오류를 발생시켜봤습니다.

"그러면 NameError: name 'a' is not defined."라고 오류 메시지가 출력됩니다.

간단하게 a를 찾을 수 없다는 말이죠.

 

이에 대해서 예외 처리로 이 오류에 맞게 특정한 작업을 수행하도록 해봅시다.

try:
    print(a)
except:
    실행할 코드
try:
    print(a)
except 발생한 오류:
    실행할 코드
try:
    print(a)
except 발생한 오류 as 오류 메시지 변수:
    실행할 코드

일단 기본적인 구조는 try블록 안에서 오류가 발생하면 except블록의 코드를 수행하도록 하며, 방법은 크게 세 가지로 나뉩니다.

첫 째는 try와 except만 사용하는 경우로, 이 경우 try블록에서 어떤 것이든 오류가 발생하면 except블록을 수행합니다.

 

둘 째는 오류의 종류를 지정하는 경우인데, 이 경우 except뒤에 예외 처리할 오류의 이름을 지정해주면 됩니다.

위의 a를 프린트하는 코드의 경우 NameError오류가 발생했으니 이를 적어주시면 됩니다.

 

셋 째는 오류의 종류와 오류 메시지를 변수로 받아오는 경우인데, 두 번째 방법에서 오류 메시지를 변수에 저장하는

부분만 다르고 나머지는 동일합니다. 위의 a를 프린트하는 코드의 경우 "name 'a' is not defined"가 오류 메시지가 됩니다.

 

이제 try~except를 사용해 예외 처리를 직접 사용해보도록 합시다.

try:
    a = 10
    b = 0
    c = a / b
except ZeroDivisionError  as e:
    print(e)
    c = a
print(c)

보통 연산을 수행하는 경우 0으로 값을 나누는 경우가 종종 발생합니다.

이럴 경우 파이썬에서 ZeroDivisionError를 발생시키는데, try~except를 사용해서 이 오류가 발생했을 경우

값을 나누지 않고 그냥 그대로 대입하도록 예외 처리를 해보도록 하겠습니다.

이러면 a를 0으로 나눌 경우 위에서 말한 예외 처리가 수행돼서 c에는 그대로 a값이 대입됩니다.

이외에 값을 정상적으로 나눈 경우 몫이 c로 들어가게 됩니다.

 

try문에서는 if문처럼 else를 사용할 수 있는데, 오류가 발생한 경우 except블록을,

그렇지 않을 경우 else블록을 수행시킬 수 있습니다.

이때 else는 반드시 except블록 뒤에 와야 합니다.

 

다음으로 try~finally에 대해서 알아봅시다.

이 finally절은 try문 수행 중에 오류 발생 여부에 관계없이 무조건 실행되는 부분입니다.

try:
    a = 10
    b = 0
    c = a / b
except ZeroDivisionError as e:
    print(e)
    c = a
finally:
    print("무조건 수행")
print(c)

위의 코드를 변경해서 a / b가 정상적으로 수행되도록 해도 finally블록이 실행되는 것을 확인할 수 있을 겁니다.

 

만약 오류가 발생했을 때 아무것도 하지 않고 넘기고 싶다면, if문에서처럼 pass를 사용하시면 됩니다.

 

이렇게 오류 발생 시 예외 처리에 대해 알아봤는데, 오류에 대해 대처하는 것이 아니고

오류를 일부러 발생시키는 방법 또한 존재합니다.

 

파이썬의 경우 raise명령어를 통해 오류를 강제로 발생시킬 수 있습니다.

raise NameError

이렇게 사용하면 아무것도 하지 않았는데 NameError오류가 발생한 것을 볼 수 있습니다.

 

이상으로 파이썬에 대한 포스팅은 마치도록 하겠습니다.

감사합니다.

반응형

'프로그래밍 언어 > 파이썬' 카테고리의 다른 글

파이썬 29. 패키지  (0) 2020.11.30
파이썬 28. 모듈  (0) 2020.11.23
파이썬 27. 메서드 오버라이딩  (0) 2020.11.19
파이썬 26. 상속  (0) 2020.11.17
파이썬 25. 클래스-2  (0) 2020.11.16