ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] 예외 처리 try, except, finally
    NAN/Python 2021. 6. 20. 20:42
    728x90

     

     

    프로그래밍을 시작하고, 꾸준히 공부하고 코드를 치게 된다면 몇 달, 몇 년이든 우리는 오류에서 벗어날 수 없다.

     

    문법적 오류이거나 코드끼리 충돌을 한다던지 등등 여러가지 이유로 오류를 접하게 되는데

     

    실력 향상을 위해서는 이런 오류 코드 역시 천천히 읽어보고 분석할 필요가 있다.

     

    오류 코드는 크게 두 가지 종류가 있는데,

     

    첫번째 문법적인 오류 Syntax Error로 이런 에러를 만날 경우 코드가 실행조차 되지 않고 멈추기 때문에

     

    반드시 문법을 교정하고 실행해야한다.

     

    두 번째 런타임 에러 혹은 예외는 코드가 실행 중에 만난 에러에 대한 경고를 나타내 준다.

     

    문법적인 오류는 코드 자체가 실행되지 않기 때문에 코드가 실행 중 다운되어 프로그램이 종료되는 일이 없지만,

     

    런타임 오류의 경우 실행 도중 갑작스럽게 프로그램이 종료되는 경우가 있기 때문에 이 같은 돌발 상황을 대비하 기해

     

    try, except라는 코드가 사용된다. 

     

    이와 같은 예외 상황을 해결하는걸 예외 처리라고 하고, 우리가 흔히 사용하는 if, else 역시 예외 처리의 한 종류이다.

     

    if, else와 같은 예외 처리 기법이 있음에도 별도의 방법이 생긴 이유는 함수와, while문을 생각하면 이해가 쉽다.

     

    while문의 경우 무한 루프에서 벗어나기 위해 break를 사용할 경우 코드가 종료되고,

     

    함수는 return으로 값을 반환하면 코드가 종료되기 때문에 else와 같은 값들이 있더라도 return, break를 만나면

     

    코드의 의미를 상실하지만 try except 그리고 이와 함께 사용되는 else, finally는 상황이 다르다.

     


    try, except

     

    try except의 구조는 if else와 유사하다. 오류가 의심되는 코드를 try안에 넣고 오류가 발생했을 때 사용될 코드를

     

    except에 넣어서 사용하는 게 기본 형태이다.

     

    try:
    	number_input = int(input("정수를 입력할게요 : "))
        
    except:
    	print("오류가 발생했다!")
        
        
    정수를 입력할게요 : 문자를 입력했다!
    오류가 발생했다!    

     

    if, else와 마찬가지로 콜론을 붙이고 들여 쓰기를 했고, 문법적인 오류 없이 사용하였다.

     

    사실 이처럼 간단한 예시를 들면 그다지 와닿지 않기 때문에 반복문을 통해 다시 살펴보자

     

    list_a = [1,2,3,4,'문자']
    list_b = []
    
    for i in list_a:
      try:
        int(i)
        list_b.append(i)
      except:
        pass
    
    print(f'숫자는 {list_b}입니다.')
    
    숫자는 [1, 2, 3, 4]입니다.

     

     

    숫자와 문자가 포함된 리스트를 반복하고 int 타입으로 변환되는 요소를 새로운 리스트에 넣는 코드인데,

     

    본래였다면 오류가 떠야 맞지만 except에 pass를 통해 오류 부분을 무시하고 진행할 수 있었다.

     

     


     

    try except else

     

     

    위에서 try 이는 예외가 발생할 가능성이 있는 코드 except는 예외가 발생했을 경우 사용할 코드라고 설명했고,

     

    새롭게 추가된 else는 예외가 발생하지 않았을 경우 사용되는 코드이다.

     

    #혼공파 발췌
    
    try:
      number = int(input("정수 입력 : "))
    
    except:
      print("예외가 발생했습니다.")  
    
    else:
      print("입력한 정수 값",number)
      print("원의 둘레 : ", 2 * 3.14 * number)  
    
    정수 입력 : 7
    입력한 정수 값 7
    원의 둘레 :  43.96

     

    기본적인 사용 방법은 예시와 같고, 오류 상황에서도 프로그램이 종료되는 것이 아닌 설정한 문구가 뜬다.

     

    추가적으로 루비와 파이썬을 제외한 다른 언어는 예외 처리에 else 구문이 없기 때문에

     

    반드시 else를 사용할 필요는 없다. 하지만 다른 누군가가 작성한 코드를 읽을 때 알고 넘어가는 것과

     

    모르고 넘어가는 것은 분명 다르기 때문에 짚고 넘어가도록 하자

     

     


    finally

     

    finally 구문은 예외 처리 구문에서 가장 마지막에 사용할 수 있고, finally 구문의 역할은 코드의 실행 여부와 무관하게

     

    항상 특정한 코드를 실행시키기 위해 사용된다. 

     

    아직 공부하지 않았지만, 파일 처리를 할 때는 파일을 열고(open) 닫지 않으면(close) 파일을 변경하는 게 불가능하기 때문에

     

    반드시 close를 해야 하는데 이를 수행하는 과정에서 오류로 인해 프로그램이 종료된다면 파일이 제대로 닫히지 않는

     

    불상사가 생기기도 한다. 이럴 때 finally 코드를 통해 파일을 닫게끔 하기도 하지만, 

     

    반드시 finally 구문을 사용해야 가능한 일은 아니기 때문에 finally 구문으로 코드가 더 깔끔해진다면 사용하도록 하자

     

     

    try:
    
      file = open('info.txt', 'w')
    
      예외.발생()
    
      file.close()
    
    except Exception as e:
      print(e)
    
    finally:
    
      file.close()    
    
    print("#파일이 제대로 닫혔는지 확인하기")  
    print("file.cosed :",file.closed)
    
    name '예외' is not defined
    #파일이 제대로 닫혔는지 확인하기
    file.cosed : True

     

    위의 코드를 확인하면 file.closes() 키워드가 실행되기 전에 오류가 발생했지만, finally 코드를 통해 파일이 정상적으로

     

    닫힌 걸 확인할 수 있다. 하지만, file.close()를 try 구문 밖에 작성을 하더라도 문제없이 파일이 닫히기 때문에 

     

    반드시 이 방법만을 사용할 필요는 없다.

     

    print('프로그램 시작')
    
    while True:
      try:
        print('try 구문 시작')
        break
        print('try 구문 종료')
      except:
        print('except 구문 시작')
      finally:
        print('finally 구문 시작')
    print('프로그램 종료')           
    
    
    프로그램 시작
    try 구문 시작
    finally 구문 시작
    프로그램 종료

     

    이처럼 finally 구문은 반복문에서 break 이후에 사용되는 경우가 종종 있다.

     

     


     

    'NAN > Python' 카테고리의 다른 글

    [Python] 외부 모듈  (0) 2021.06.20
    [Python] 예외 처리 고급  (0) 2021.06.20
    [Python] 함수 고급 (튜플,map,filter,lambda)  (0) 2021.06.20
    [Python] 함수의 활용  (0) 2021.06.20
    [Python] 반복문 while, for  (0) 2021.06.06
Designed by Tistory.