인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
Exception
- 기본 개념
예외는 작성된 코드의 의도와 달리 비정상적으로 작동하는 것을 의미한다.
# 예외 종류 # SyntaxError, TypeError, NameError, IndexError, ValueError.. 등 # 기본 예시 # SyntaxError print(error) print("error")) if True pass # 문법상 오류가 존재할 때 발생하는 예외이다. # NameError a = 10 b = 15 print(c) # 선언하지 않은 변수를 참조할 때 발생하는 예외이다. # ZeroDivisionError print(100/0) # 결과 : # ZeroDivisionError: division by zero # 0으로 어떤 수를 나눌 수 없기 때문에 발생하는 예외이다. # IndexError x = [50, 70, 90] print(x[1]) # 결과 : 70 print(x[4]) # 결과 : IndexError: list index out of range # 리스트의 인덱스번호 범위를 벗어날 때 발생하는 예외이다. print(x.pop()) # 결과 : 90 print(x.pop()) # 결과 : 70 print(x.pop()) # 결과 : 50 print(x.pop()) # 결과 : IndexError: pop from empty list # 데이터가 더 이상 존재하지 않는데 데이터를 가져올 때 발생하는 예외이다. # KeyError dic = {'name': 'Lee', 'Age': 41, 'city': 'Busan'} print(dic['hobby']) # 결과 : KeyError: 'hobby' # 딕셔너리에 존재하지 않는 키를 사용하여 벨류를 호출하고자 할 때 발생하는 에외이다. print(dic.get('hobby')) # None # get함수를 사용하면 딕셔너리에 존재하지 않는 키를 입력해도 None을 출력한다.(예외 발생X) # AttributeError import time print(time.time()) # 결과 : 1634634915.764025 print(time.time2()) # 결과 : # AttributeError: module 'time' has no attribute 'time2'(예외 발생) # AttributeError는 모듈과 클래스에 있는 잘못된 속성을 사용할 때 발생하는 예외이다. # time은 파이썬 내부의 모듈이며, 파이썬 time 모듈에는 time이라는 함수는 존재하지만 # time2라는 함수는 존재하지 않기 때문에 예외가 발생한 것이다. # ValueError x = [10, 50, 90] x.remove(50) print(x) # 결과 : [10, 90] (예외 발생X) x.remove(200) # ValueError: list.remove(x): x not in list(예외 발생) # 시퀀스형 자료안에 존재하지 않은 데이터를 참조할 때 발생하는 예외이다. # FileNotFoundError f = open('test.txt') # 결과 : # FileNotFoundError: [Errno 2] No such file or directory: 'test.txt' # 없는 파일을 참조하여 open( ) 함수로 가져올 때 발생하는 예외이다. # TypeError x = [1,2] y = (1,2) z = 'test' print(x + y) # 결과 : TypeError: can only concatenate list (not "tuple") to list # 튜플과 리스트는 연산이 불가능하다. print(x + z) # 결과 : TypeError: can only concatenate list (not "str") to list # 리스트와 문자열도 연산이 불가능하다. print(y + z) # 결과 : TypeError: can only concatenate tuple (not "str") to tuple # 튜플과 문자열도 연산이 불가능하다. # 이처럼 자료형에 맞지 않는 연산을 할 때 발생하는 예외이다. # 이러한 예외는 아래의 코드와 같이 형 변환을 통해 처리할 수 있다. print(x + list(y)) # 결과 : [1, 2, 1, 2] (예외처리) print(x + list(z)) # 결과 : [1, 2, 't', 'e', 's', 't'] (예외처리)
- 응용 개념
# 예외 처리 # try에는 예외가 발생할 가능성이 있는 코드를 작성한다.(예외 발생이 의심되는 코드 작성) # 'except ErrorName'은 try에서 예외가 발생할 경우, 예외를 처리하는 코드를 실행한다. # try에서 예외가 발생해도 except에서 예외를 처리했기 때문에, 프로그램이 중단되지 않고 # 다음의 코드를 계속 실행한다.(try-except를 사용하는 이유) # else는 try의 작성된 코드에서 예외가 발생하지 않을 경우에 실행된다. # 단, else는 try에서 예외가 발생하여 except의 코드가 실행된 경우에는 실행되지 않는다. # finally는 예외의 발생여부와 상관없이 마지막에 항상 실행된다. # 활용 예시 # 예시1 name = ['Kim', 'Lee', 'Park'] try: z = 'Kim' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except ValueError: print('Not found it! - Occurred ValueError!') else: print('Ok! else.') # 결과 : # Kim Found it! 1 in name # Ok! else. # 예외 발생 X try: z = 'Lee' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except ValueError: print('Not found it! - Occurred ValueError!') else: print('Ok! else.') # 결과 : # Lee Found it! 2 in name # Ok! else. # 예외 발생 X try: z = 'Cho' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except ValueError: print('Not found it! - Occurred ValueError!') else: print('Ok! else.') print("Hello World") # 결과 : # Not found it! - Occurred ValueError! # Hello World # 예외 발생 # 예시2 try: z = 'Kim' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except: print('Not found it! - Occurred ValueError!') else: print('Ok! else.') try: z = 'Kim' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except Exception: print('Not found it! - Occurred ValueError!') else: print('Ok! else.') # 정리 : # except ErrorName에서 예외명을 생략하거나 ErrorName 대신 Exception을 쓰면 # 모든 종류의 예외를 인식하고 처리할 수 있다.(Exception은 모든 예외의 부모격이다.) # 하지만 이러한 경우에는 어떤 예외가 발생했는지 구체적으로 알 수 없는 단점이 있다. # 즉, 어떤 종류의 예외가 발생할지를 예측할 수 있다면 예외명을 써주면 되고, # 만약 어떤 종류의 예외가 발생할지 모르면 예외명을 생략하거나 Exception을 써주면 된다. # 예시3 try: z = 'Cho' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except Exception as e: print(e) # 예외 관련 내용을 출력함 print('Not found it! - Occurred ValueError!') else: print('Ok! else.') print("Hello World") # 결과 : # 'Cho' is not in list # Not found it! - Occurred ValueError! # Hello World # except Exception의 코드 작성할 경우, 예외의 종류를 알 수 없는 문제는 # alias와 print문을 사용하여 해결할 수 있다. # 즉, except Exception as e:처럼 코드를 작성한 후에 print(e)코드를 통해 # 예외의 종류를 출력하면 된다. # 하지만 except 앞에 예외명을 적어주는 것이 가장 좋은 방법이다.(로그 목적) # 예시4 try: z = 'Cho' x = name.index(z) print('{} Found it! {} in name'.format(z, x + 1)) except Exception as e: print(e) print('Not found it! - Occurred ValueError!') else: print('Ok! else.') finally: print('Ok! finally!') print("Hello World") # 결과 : # 'Cho' is not in list # Not found it! - Occurred ValueError! # Ok! finally! # Hello World # finally는 예외 발생여부와 관계없이 항상 실행된다. # 예제5 try: a = 'Park' if a == 'Kim': print('Ok! Pass!') else: raise ValueError except ValueError: print('Occurred! Exception!') else: print('Ok! else!') # 결과 : Occurred! Exception! # raise는 예외를 강제적으로 직접 발생시킨다. # a가 Park이기 때문에 else를 통해 raise ValueError코드가 실행되고, # try에서 예외를 강제적으로 발생시켜 except가 실행되는 것이다. # 이 경우에 try-else의 else는 예외가 발생했기 때문에 실행되지 않는다. # 일반적으로 a가 Kim과 달라도 파이썬 내부적으로는 try에서 예외가 발생하지 않는다. # 즉, a의 값이 다르고 if문의 코드가 실행되지 않을 뿐, 예외는 발생하지 않지만 # if-else의 else에서 raise를 사용함으로써 강제적으로 예외를 발생시킨 것이다. try: a = 'Kim' if a == 'Kim': print('Ok! Pass!') else: raise ValueError except ValueError: print('Occurred! Exception!') else: print('Ok! else!') # 결과 : # Ok! Pass! # Ok! else! # 위의 코드와 동일한 원리(a가 Kim이기 때문)
'Python' 카테고리의 다른 글
Python - External functions (0) | 2021.10.18 |
---|---|
Python - Built in functions (0) | 2021.10.18 |
Python - package (0) | 2021.10.18 |
Python - module (0) | 2021.10.18 |
Python - class (0) | 2021.10.15 |
댓글