파이썬 try, except, else - paisseon try, except, else

조건, 예외, 끝에선

  1. if ~ else ~
  2. try ~ except ~
    `

조건문, 예외처리 는 비슷한 점이 많지만
정확히 알고 있다면 생각보다 적합한 순간에 큰 도움을 주는 것들이다

1. if ~ else

흔히 사용하는 조건문의 사용방법은 매우 간단하다

if True:
    # 실행할 내용
else:
    # 위에 조건이 True가 아닐때 실행할 내용

기본적으로는 if 다음에 오는 내용이 참일 때 아래 내용이 실행되고
거짓일때 else 아래 내용이 실행된다
조건이 여러가지일 때는 elif 를 사용할 수 있다.

if True:
    # 조건이 참일때 실행할 내용
elif False:
    # 조건이 거짓일때 실행할 내용
else:
    # 위 내용이 전부 만족하지 않을 때 실행할내용

if, elif 안에 있는 내용이 True False 중 하나를 만족하면 좋겠지만
오류가 나는 경우 아랫줄이 실행되지 못하고 빠져나와 오류를 알려준다
예상치 못한 오류라면 너무 고마운 상황이지만 예상가능한 오류지만 어떤 오류인지
오류 상황에서 추가 동작을 지시하고 싶을때 try ~ except ~를 사용해주면 된다

2. Try ~ except ~

지시한 내용을 실행하다 오류가 나는경우 전체적으로 멈추는 것이 아니라
예외처리를 하고 다음줄로 넘기려고 하는 상황에서 사용가능하다

a = ['1' ,'2', 'a', '3']

for i in a:
    print(int(i))

print("pass")

a 리스트엔 스트링 타입 데이터 4개가 있다
이 데이터들을 int 화 시켜 출력시키고 싶은 상황인데
중간 'a' 는 int화가 불가능한 데이터기 때문에 invalid literal 오류를 발생시킨다
따라서 오류 메세지를 보이고 나가버리고 아래 print("pass")는 실행되지 못한다.

프로그래밍을 하다보면 발생할 오류가 예측 가능하고
일단은 예외로 두고 나머지 코드들이 실행되도록 해야할 상황이 있는데

a = ['1' ,'2', 'a', '3']

try:
    for i in a:
        print(int(i))
except:
    print("error")

print("pass")

try ~ except ~를 사용해주면

1
2
error
pass

중간에 에러가 있더라도 코드 마지막줄까지 실행시켜준다
하지만 발생한 오류는 꼭 알고 있어야하고
결국 따로 처리를 해줘야한다는 사실을 잊지 말자

try:
     a = ["a", "b"]
     third = a[3]
except IndexError:
    print("error")

print("pass")

except 다음엔 발생할 오류를 예측해 오류 종류에 따른 코드를 실행시켜줄 수 있다.
위 상황은 흔히 볼 수 있는 인덱스 오류인데 a 리스트에 3번째 인자가 없는데 호풀했기 때문에 인덱스에러가 발생했다.
이 경우 인덱스 에러가 아닌 에러가 발생하면 아랫줄을 실행하지 못하고 중지된다.

try:
     a = ["a", "b"]
     third = a[3]
except IndexError as e:
    print(e)

에러에 대한 메세지를 위와 같이 출력도 가능하다

list index out of range

다음과 같이 인덱스에러에 관한 메세지를 출력하기 때문에
디버깅할때 유리하다

try:
     a = ["a", "b"]
     third = a[3]
except IndexError:
    print("error")
except AssertionError:
    print("other error")

print("pass")

위처럼 한개 이상의 오류를 다룰 수 있다
파이썬에서 발생하는 오류의 종류는
Python docs 에서 확인 가능하다.

try:
     a = ["a", "b"]
     third = a[3]
except IndexError:
    print("error")
finally:
    print("pass")

finally를 통해 Try 가 실행되든 except가 실행되든 마지막에 실행될 코드를 넣을 수 있다
print("pass")는 결국 마지막에 실행된다.

if, else 문으로만 모든 에러를 처리한다면 indent가 늘어남에 따라 가독성이 떨어지는 코드가 되기 마련입니다. 따라서, 예외처리 구문을 사용하여 코드를 깔끔하게 작성하도록 하여야 합니다.

이번 포스팅에서는 Python의 예외처리 방법에 대해서 간단하게 알아보겠습니다.

Python의 예외처리의 기본 흐름은 try -> except -> else -> finally 순으로 진행됩니다. 모든 단계를 사용할 필요는 없고 필요에 따라 적절히 골라서 사용하면 됩니다. 하나씩 설명해보겠습니다.

try:
    # 에외처리할 코드
    print(10/0)
except ZeroDivisionError:
    # 발생하는 에러에 대한 처리
    print("zero division error")

가장 기본적으로 사용되는 try, except 구문입니다. try 구문에는 예외처리의 대상이 되는 코드를 넣어주고, except 에는 발생이 예상되는 에러를 적습니다. 위의 예제에서는 ZeroDivisionError라고 에러를 명시해주었지만, 이를 생략한다면 어떤 종류의 예외도 처리가 가능합니다.

except 구문의 우선순위

try:
    # 에외처리할 코드
    print(10/0)
    print(leffe)
    
except NameError:
    # 먼저 쓸 수록 높은 우선순위
    print("name error")
except ZeroDivisionError:
    # 발생하는 에러에 대한 처리
    print("zero division error")

except 구문의 경우 위에 적은 에러가 우선순위를 가집니다. 첫번째 print를 실행하는 경우 ZeroDivisionError가 발생하는데, except에 적힌 순서에 따라 NameError인지를 먼저 체크하고 다음에 존재하는 except를 체크하여 "zero division error"를 출력하게 됩니다.

다수의 except

try:
    # 에외처리할 코드
    print(leffe)
    
except NameError, ZeroDivisionError:
    # 발생하는 에러에 대한 처리
    print("Name or ZeroDivision error")

하나의 except에 여러 개의 에러를 처리할 수도 있습니다. NameError, ZeroDivisionError중 하나라도 에러가 발생한다면 print 구문을 실행하게 됩니다.

에러 무시하기

try:
    # 에외처리할 코드
    print(leffe)
    
except NameError:
    # 발생하는 에러에 대한 처리
    pass

pass문을 활용한다면 에러가 발생할 때 아무런 처리를 하지 않고 넘어가게 할 수도 있습니다. 코드의 목적에 따라 다양하게 활용될 수 있습니다.

try & except & else

try:
    # 에외처리할 코드
    print(10/2)
except ZeroDivisionError:
    # 발생하는 에러에 대한 처리
    print("zero division error")
else:
    # 에러가 발생하지 않았을 경우에 실행
    print("no error :)")

else 구문을 활용한다면 에러가 발생하지 않았을 경우에 실행될 코드를 작성할 수 있습니다.

try & except & else & finally

try:
    # 에외처리할 코드
    print(10/2)
except ZeroDivisionError:
    # 발생하는 에러에 대한 처리
    print("zero division error")
else:
    # 에러가 발생하지 않았을 경우에 실행
    print("no error :)")
finally:
    # 예외 발생여부에 관계없이 항상 실행
    print("always")

finally 구문은 에러의 발생여부와 관계없이 항상 코드를 실행하는 부분입니다. 마찬가지로 여러 방면에서 활용될 수 있습니다.

raise - 에러 발생시키기 

try:
    # 에외처리할 코드
    print(3)
    # 강제로 에러를 발생시킴
    raise NameError
    
except NameError:
    # 발생하는 에러에 대한 처리
    print("Name or ZeroDivision error")

raise 구문은 에러를 강제로 발생시키게 할 수 있습니다. 위의 코드는 정상적으로 동작하는 코드이지만 raise 구문에 의해 except 내의 코드가 실행되게 됩니다.

지금까지 Python에서의 예외처리를 알아보았습니다. 저도 try, except 구문은 익숙하게 사용하고 있었지만 else, finally와 같은 구문은 잘 사용하지 않았던 것 같습니다. 알아둔다면 적절한 상황에서 코드를 깔끔하게 작성할 수 있을 것 같아 정리를 해보았습니다.