[python] ❗❓ 예외 처리 Exception Handling

    반응형

    예외 처리는 프로그램 실행에서 매우 중요하다.

    TV 리모컨을 조금만 잘못 눌러도 TV가 꺼져버린다면(실행이 중단되고 에러가 난다면) 좋은 TV라고 할 수 없을 것이다.

     

    파이썬에서 대부분의 에러는 에러메시지와 함께 어디서 어떤 에러가 발생했는지 알려준다.

    다음 코드의 "ZeroDivisionError", "NameError", "TypeError" 같이 built-in exception의 이름이 에러메시지에 출력된다.

    이를 이용해서 우리는 예외 처리를 할 수 있다.

    >>> 10 * (1/0)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ZeroDivisionError: division by zero
    
    >>> 4 + spam*3
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'spam' is not defined
    
    >>> '2' + 2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: can only concatenate str (not "int") to str

     

    ❗❓ try-except

    기본적으로try-except구문은 다음과 같이 작동한다.

    • try구문(try 키워드와 except 키워드 사이에 있는 statements)이 실행된다.
    • 만약 예외가 발생하지 않는다면 except 구문은 생략되고 try 구문이 끝까지 실행된 후 종료된다.
    • 만약 try 구문 실행 중 except 키워드 뒤에 있는 예외 이름과 일치하는 예외가 발생한다면, try 구문의 나머지 실행문들은 생략되고 해당하는 except 구문에 있는 실행문들이 실행된 후, 예외 발생한 실행문 이후의 try 구문이 실행된다.
    • 만약 try 구문 실행 중 예외가 발생했지만, 발생한 예외가 except 구문 안에서 일치하는 예외가 아니라면, 이것은 unhandled exception이므로 전체 실행이 에러 메시지가 출력되며 중단된다.

    서로 다른 예외들을 각각 처리하기 위해 하나의 try 구문은 한 개 이상의 except절을 가질 수 있고, " as " 뒤에 alias를 지정할 수도 있다.

    try:
    	[STATEMENT]
    except ZeroDivisionError as zero_div_err:
    	print(zero_div_err)
    except NameError as name_err:
    	print(name_err)
    except (RuntimeError, TypeError):
    	[STATEMENT]

    ❗❓ else

    try-except 구문에 추가적으로 else 구문을 넣을 수 있다.

    else 구문은 코드가 exception없이 정상적으로 처리되었을 때에만 실행된다.

    (try-except 뒤에 위치한다.)

    try:
    	[STATEMENT]
    except:
    	[STATEMENT]
    else:
    	[STATMENTT]

     

    ✔️example

    for arg in sys.argv[1: ]:
        try:
            f = open(arg, 'r')
        except OSError:
            print('cannot open', arg)
        else:
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()

    정상적으로 실행되었을 때에만 else 구문이 실행되므로, OSError가 났을 때에는 파일이 몇줄인지 출력하는 구문은 실행되지 않는다!

    더보기

    +) 궁금

    for arg in sys.argv[1: ]:
        try:
            f = open(arg, 'r')
            print(arg, 'has', len(f.readlines()), 'lines')
            f.close()
        except OSError:
            print('cannot open', arg)
            pass

    위에 코드랑 뭐가 많이 다를까,,..?


    ❗❓ finally

    finally구문은 try 구문에서 예외가 발생하던, 발생하지 않던 try 구문 실행 이후 무조건 실행되는 구문이다.

    finally를 사용하는 이유는??

    unhandled exception(except 구문에서 처리하지 않은 예외)이 발생해도 finally 구문은 실행된 후, 에러 메시지가 뜬다.

     

    ✔️example

     

     

    finally절은 모든 event에서 실행됨을 볼 수 있다.


    exception이 발생할 때와 발생하지 않을 때 try, except, else, finally의 실행 여부


    ❗❓ raise

    raise는 직접 강제로 오류를 발생시키는 구문이다. 

     

     

     

     

     

     

     

    반응형

    댓글