파이썬 기초

파이썬 에러 대처 예외 처리 중첩 이중 try except

코니코니 2022. 12. 4. 15:39
반응형

파이썬 에러 대처 예외 처리 중첩 이중 try except


파이썬 코딩을 하다 보면 오류가 걸릴 수 있는 위치를 예측하거나 예측하지 못하더라도 오류가 걸렸을 때 강제로 프로그램을 종료시키지 않고 계속 진행을 할 수 있도록 예외 처리를 넣어줄 수 있습니다.

 

만약 콘솔로 프로그램을 구동한다면 에러가 발생했을 때 콘솔 프로그램이 바로 종료가 되다 보니 에러를 체크하기 힘들뿐더러 특정 에러가 발생해도 프로그램을 계속 구동시켜야 하는 상황도 생길 수가 있습니다. 간단한 예시로 파이썬에서 예외를 처리하는 방법에 대해서 설명합니다.

a = 1
print(a + 'd')

==결과==
TypeError: unsupported operand type(s) for +: 'int' and 'str'

먼저 파이썬에서 예외 처리를 하지 않는다면 에러의 원인이 로그창에 출력되면서 프로그램이 종료됩니다. 위 예시를 보면 a라는 정수에 d라는 문자열이 더해지면서 TypeError가 발생하게 됩니다. 여기서 예외 처리를 넣어준다면 에러가 뜨더라도 프로그램은 강제로 종료되지 않습니다.

a = 1

try:
    print(a + 'd')
except:
    print('에러 발생')

==결과==
에러 발생

마치 if문에서 if와 else를 사용하는 것처럼 예외 처리는 try와 except를 사용합니다. try 들여쓰기에 들어가는 코드 중에서 에러가 발생할 경우 except로 넘어오게 되는 것입니다.

 

하지만 보통의 경우 위처럼 간단하게 예외를 처리하지 않습니다. 에러가 생기는 이유는 다양하기 때문에 특정 에러가 걸릴 것을 미리 파악하고 에러 명칭을 적어주는 것이 좋은 예시입니다.

a = 1

try:
    print(a + 'd')
except TypeError:
    print('타입 에러!')
    
==결과==
타입 에러!

코드에서 타입 에러가 발생 할 것을 예측하고 미리 except에 TypeError를 명시해줬습니다. 만약 타입 에러가 아니라면 기존처럼 에러가 출력되면서 코드는 멈추게 되겠죠.

a = 1
b = []

try:
    print(a + 1)
    print(b[1])
except TypeError:
    print('타입 에러!')
except IndexError:
    print('인덱스 에러!')
    
==결과==
2
인덱스 에러!

그리고 except문은 여러개를 작성할 수 있습니다. 에러는 다양하게 발생할 수 있기 때문에 경우의 수를 미리 생각하고 처리할 방법을 따로 코드로 작성하여 관리를 하는 것이죠.

 

먼저 a + 1은 정수 + 정수에 해당이 되기 때문에 타입 에러가 발생하지 않습니다. 그다음 b[1]의 경우 b라는 리스트에 요소가 없기 때문에 인덱스 에러가 발생하게 됩니다. except문에 인덱스 에러를 명시했기 때문에 프로그램은 종료가 되지 않고 에러를 처리하게 됩니다.

b = []

try:
    print(b[1])
except (TypeError, IndexError):
    print('타입 에러 또는 인덱스 에러!')

==결과==
타입 에러 또는 인덱스 에러!

하나의 except문에 여러개의 에러를 같이 명시해서 넣어줄 수 있습니다. 여러 개를 동시에 사용할 때는 소괄호에 묶어서 나눠야 합니다.

b = ['요소1', '요소2']

try:
    print(b[1])
except (TypeError, IndexError):
    print('타입 에러 또는 인덱스 에러!')
else:
    print('에러 없을 때 처리되는 else')

==결과==
요소2
에러 없을 때 처리되는 else

try도 if문과 마찬가지로 else를 넣을 수 있습니다. 만약 에러가 발생하지 않는다면 else문이 열리게 됩니다.

b = []

try:
    print(b[1])
except (TypeError, IndexError):
    print('타입 에러 또는 인덱스 에러!')
else:
    print('에러 없을 때 처리되는 else')
finally:
    print('그냥 마지막에 무조건 발동되는 finally')
    
==결과==
타입 에러 또는 인덱스 에러!
그냥 마지막에 무조건 발동되는 finally

예외 처리의 마지막에 finally를 넣어줄 수 있습니다. try문에서 에러가 발생하던 안 하던 무조건 finally는 실행됩니다.

b = []

try:
    print(b[1])
except IndexError:
    print('타입 에러 또는 인덱스 에러!')
    try:
        print(b[1])
    except IndexError:
        print('안에서 에러 발생!')

==결과==
안에서 에러 발생!

 

예외 처리 안에서 또 try문을 만들어서 이중으로 사용을 할 수 있습니다. 프로그램의 경우의 수가 많은 경우에는 이렇게 중첩으로 예외를 넣는 경우도 있지만 이렇게 계속 예외 안에서 예외를 만드는 것은 가독성 면에서도 좋지 않은 것 같습니다. 가능하다면 try문 하나에서 모든 예외를 처리하는 것이 좋을 것 같네요.

반응형