본문 바로가기

programming/python

[ python 친해지기 #17 ] 파이썬 예외 처리

[ python 친해지기 #17 ] 파이썬 예외 처리

 

안녕하세요. 심심한 코딩쟁이입니다.

 

오늘은 파이썬의 예외 처리에 대해서 알아보도록 하겠습니다.

 

코드를 작성하고 테스트를 위해서 실행해보면 모두 한번쯤은 오류가 발생하는 상황을 맞이하게 될 것입니다.

 

이때 오류를 유연하게 처리하도록 도와주는 것이 예외 처리 방법이다.

 

함께 살펴보시죠.

 

python-logo
파이썬 로고


왜 오류가 발생할까?

 

코딩을 하다보면 분명 제대로 코드를 작성한 것 같은 느낌이 가득하지만 코드를 실행하면 오류가 발생합니다.

 

빈번하게 일어나는 오류들을 살펴보면서 왜 오류가 발생하는지 알아봅시다.

 

# 오류 발생 케이스

# 0으로 나눌 때 ZeroDivisionError

a = 3
b = 0
c = a/b

# 오류 발생 ##################################
Traceback (most recent call last):
  File "d:\test.py", line 6, in <module>
    c = a/b
ZeroDivisionError: division by zero
##############################################

# 인덱스에 잘못 접근했을 때 IndexError

test_list = [1, 2, 3, 4]
print(test_list[5])

# 오류 발생 ##################################
Traceback (most recent call last):
  File "d:\test.py", line 11, in <module>
    print(test_list[5])
IndexError: list index out of range
##############################################

# 없는 파일을 오픈하려할 때 FileNotFoundError

f = open('xxx.txt', 'r') # xxx.txt는 존재하지 않는 파일

# 오류 발생 ######################################################
Traceback (most recent call last):
  File "d:\test.py", line 15, in <module>
    f = open('xxx.txt', 'r')
FileNotFoundError: [Errno 2] No such file or directory: 'xxx.txt'
##################################################################

 

파이썬이 해당 코드가 제대로 작동하지 않을 것을 알아채고 오류메시지를 보여주면서 실행을 중단을 시켜줍니다.

 

이때 우리는 예외 처리를 통해 코드가 중단되지않도록 해줄 수 있습니다.


파이썬 예외 처리 방법

 

파이썬에서 오류를 다루는 방법으로 예외 처리를 사용하는데 다양한 구조로 변형이 가능합니다.

 

예제를 보면서 살펴보시죠.


try except

 

오류를 예외 처리하는 예제입니다.

 

# 오류 예외 처리 try except

# except 뒤에 아무것도 없는 경우
# 모든 오류를 처리합니다.

try:
    f = open('xxx.txt', 'r')
except:
    print("에러 발생")

# except 뒤에 특정 오류 지정
# 지정된 오류만 처리합니다.

try:
    f = open('xxx.txt', 'r')
except FileNotFoundError:
    print("FileNotFound 에러 발생")
    
# except 뒤에 특정 오류 지정후 대입할 변수 설정
# 지정된 오류만 처리하고 오류가 변수에 대입됨
# 보통 어떤 오류가 발생했는지 알고싶을 때 이 방법을 사용

try:
    f = open('xxx.txt', 'r')
except FileNotFoundError as e:
    print(e)

try except finally

 

오류 예외 처리 예제입니다.

 

finally 절에는 무조건 실행되어야하는 코드를 위치시킵니다.

 

# 오류 예외 처리 try except finally
# finally 에 존재하는 코드는 오류가 발생하든 안하든 무조건 실행됩니다.
# 꼭 실행해야하는 코드를 위치시켜두면 잘 작성한 코드라고 볼 수 있습니다.
# xxx.txt 파일이 존재하고 ZeroDivision 오류를 발생시키면서 finally 문의 동작을 확인합니다.

try:
    f = open('xxx.txt', 'r')
    tmp = 4/0
except:
    print("에러 발생")
finally:
    f.close()
    print("파일 객체 닫음")

try:
    f = open('xxx.txt', 'r')
    tmp = 4/0
except FileNotFoundError: # 여러 에러를 각각 예외 처리
    print("FileNotFound 에러 발생")
except ZeroDivisionError: # 여러 에러를 각각 예외 처리
    print("ZeroDivision 에러 발생")
finally:
    f.close()
    print("파일 객체 닫음")

try:
    f = open('xxx.txt', 'r')
    tmp = 4/0
except (FileNotFoundError, ZeroDivisionError) as e: # 여러 에러를 묶어서 예외 처리
    print(e) 
finally:
    f.close()
    print("파일 객체 닫음")

try except else

 

오류 예외 처리 예제입니다.

 

try 문에서 오류가 발생하지 않을 때만 else 절이 실행됩니다.

 

# 오류 예외 처리 try except else
# try에서 오류가 발생하지 않았을 때만 else가 실행됩니다.

try:
    passwd = int(input('비밀번호를 입력하세요(4자리): '))
except:
    print('숫자만 입력해주세요.')
else:
    if passwd // 10000:
        print('4자리 숫자를 입력해주세요.')
    elif passwd != 4885:
        print('비밀번호가 틀렸습니다.')
    else:
        print('로그인 성공.')

특정 오류 넘어가기

 

# 특정 오류에 대해 아무런 동작 없이 넘어가도록 하려면 pass를 사용합니다.

try:
    오류가 발생해도 그냥 지나갈 오류를 지닌 코드
except:
    pass

나만의 오류 만들기

 

코딩을 하다보면 내가 짠 프로그램에 맞는 오류가 필요한 경우가 있습니다.

 

나만의 오류를 직접 만들어서 코드에 적용시켜 봅시다.

 

# 나만의 오류 직접 만들기

class PasswdError(Exception): # 오류를 만들 때 Exception 클래스를 꼭 상속받아야함
    def __str__(self): # 오류 메시지 직접 설정
        return '비밀번호가 틀립니다.'

def check_passwd(passwd): # 비밀번호 체크 함수
    if passwd != 1234:
        raise PasswdError()
    print("로그인 성공")
    
try:
    check_passwd(1234) # 로그인 성공
    check_passwd(5555) # 오류 발생
except PasswdError as e:
    print(e) # 직접 설정한 오류 메시지가 출력됩니다.

 

오류를 만들기 위해서는 클래스를 만들어야하며 Exception 클래스를 꼭 상속받아야합니다.


여기까지 파이썬의 오류 예외 처리에 대해서 알아보았습니다.

 

글을 보면서 이해가 안되시거나 궁금하신 점이 생기셨다면 댓글로 남겨주시기바랍니다.

 

파이썬과 점점 더 친해지시는 여러분들을 위해 더 양질의 내용을 준비할 수 있도록 노력하겠습니다.

 

감사합니다.

반응형