[Python] 예외처리

반응형
    반응형

    예외처리에 대해 알아봅시다.

    프로그램을 실행하다 보면 의도치 않게 오류가 발생하는 경우가 많이 생깁니다. 오류가 나서 프로그램이 중단될 수도 있고 있는 파일이 없어져서 처리가 안될 수도 있습니다. 오류가 나면 프로그램이 중단되기 때문에 어떤 오류가 났는지 확인하거나 프로그램상 없어도 되거나 예외적인 상황이 발생했을 때 패스를 하는 방식으로 처리를 해줘야만 프로그램을 원활하게 실행할 수 있습니다. 이런 처리를 예외처리라고 합니다.

    파이썬에서는 try;except 명령으로 할 수 있습니다.

    stock = ['삼성전자', '엘지전자', 'SK텔레콤']
    stock.index("삼성") 

    리스트에서 찾고자 하는 이름이 없다면 위 같은 오류가 발생합니다. 그럼 코드 진행이 안 되겠죠?

    이럴 때 try;except를 써서 해결할 수 있습니다. try;except의 내용은 try의 문자 뜻대로 한번 시도해봐서 조건이 만족하면 실행하고 try의 조건이 만족하지 않으면 except의 내용을 실행하도록 설정하는 것입니다.

    stock = ['삼성전자', '엘지전자', 'SK텔레콤']
    try:
        stock.index("삼성")
    except:
        print ("다음 종목이 없습니다.")
    else:
        print ("삼성")

    오류가 나야 하지만 try로 오류에서 벗어났습니다. 위 예를 보면 try에서 리스트에 '삼성' 이 있는지 찾아달라고 요청하고 리스트에 없으면 '다음 종목이 없습니다'를 요청했습니다. 삼성은 리스트에 없으므로 '다음 종목이 없습니다'가 나오는 것으로 오류처리가 된 것을 볼 수 있습니다. 이런 방식으로 오류처리를 할 수 있습니다.

    자주 하는 오류처리

    · 계산 오류

    0으로 나눠지는 경우가 있습니다. 당연히 나눠지지 않는데 만약 리스트 갱신을 하고 있고 우연찮게 원소가 하나도 없으면 len(a)= 0 이 되므로 계산 오류가 발생할 수 있습니다. 오류처리는 각자 알맞은 방법으로 하면 되겠습니다.

    a = []
    len(a)
    print(len(a))
    try:
        5/ len(a) 
    except NameError:
        print ("NameError 발생")
    except IndexError:
        print ("IndexError 발생")
    except ZeroDivisionError:
        print ("ZeroDivisionError 발생")

    저는 어떤 오류가 생겼는지 알려주는 방식으로 오류처리를 했습니다.

    · 파일 내에서 오류 발생

    파일을 읽었는데 파일이 없거나 키보드를 잘못 눌러서 키보드 관련 에러가 날 수도 있습니다. 이번엔 파일을 아예 닫아버리겠습니다.

    finally를 사용합니다. finally를 이용하면 위의 어떤 일이 일어나도 무조건 실행이 됩니다.

    import sys
    import time
    
    f = None
    try : 
        f=open('text.txt')
        while True:
            line = f.readline()
            if len(line) ==0:
                break
            print(line)
    except IOError:
        print('This file can not find')
    except KeyboardInterrupt:
        print('Canelled the reading from the file')
    finally:
        if f:
            f.close()
        print('Closed the file')

    위 예처럼 파일을 열었지만 해당 파일이 없어 오류가 발생해야 하는데 예외처리가 되었고 finally를 이용해 파일을 닫아버렸습니다.

     

    반복문에서의 try, except

    별건 아니지만 흔히 하는 실수인 것 같아서 공유합니다.
    보통 반복문에서 try, except를 쓰는 경우 반복이 끊기지 않고 반복문을 유지하고 싶어서 씁니다.
    그런데 try를 for 문 밖에 넣으면 반복문이 끊깁니다. while 도 마찬가지입니다.
    실제 try는 오류가 뜨면 바로 except로 내려가게 됩니다.
    즉, except 처리를 한 후 try except 코드는 마칩니다.
    따라서 반복문 밖으로 try 를 시도한다면 반복문에서의 오류가 발생하고 except로 넘어가게 됩니다.

    하지만, 반복문 안에서 try를 넣는다면 오류발생시 except로 넘어가지만
    try, except 문이 반복문 안에 있으므로 반복문의 한 부분이 끝나게 됩니다.따라서 다음번으로 넘어가게 됩니다.

    예를 보겠습니다.

    for i in stock:
        try:
            stock.index('삼성')
        except:
            print('오류 발생')

     

    for문 안에 try를 넣었습니다.
    실제로 삼성은 stock에는 없으므로 오류발생이 나올겁니다.
    그런데 except를 처리하고 for문을 다시 돌아갔기 때문에 except로 가는 횟수를 보면 3번이 나옵니다.

     

    반면에, try를 for 문 밖으로 하면 오류발생이 한번만 나옵니다.
    for문에서 한번이라도 오류가 나오면 except로 넘어가도록 했기 때문입니다.

    try:
        for i in stock:
            stock.index('삼성')
    except:
        print('오류 발생')

    오류처리를 위해 try를 사용해봤는데 상황에 따라 try를 유연하게 사용할 수 있습니다. try의 의미를 잘 기억하면서 다양하고 창의적으로 써보시기 바랍니다.

    댓글

    Designed by JB FACTORY

    ....