파이썬 예외(에러)의 종류
SyntaxError : 잘못된 문법
보통 코딩을 할 VS Code, 파이참과 같은 IDE(통합개발환경)에서 개발을 하는데, 이러면 어느정도 문법을 자동으로 교정해주기 때문에 크게 걱정하지 않아도 된다. 그래도 뭐 콜론 같은 거 빼먹는 경우가 종종 있어서 막상 실행하면 SyntaxError: unvalid syntax 라는 에러 메시지를 흔히 마주할 수 있다.
NameError : 참조변수 없음
이건 예를 들면 코드에서 변수 a 를 출력하도록 했는데, 코드 상에서 a 를 선언한 적이 없다면 발생하는 에러다.
NameError: name 'a' is not defined 라고 뜰 거다. 정의되지 않았다는 뜻이 되겠다.
ZeroDivisionError : 0으로 나눌 수 없음
파이썬에서 print(10/0)이라고 코딩을 해버리면, 10 나누기 0 값을 출력한다는 의미인데,
이건 문법적으로는 에러가 없지만 막상 실행하면 런타임 시에 ZeroDivisionError: division by zero 라는 오류 메시지가 뜬다.
IndexError : 인덱스 범위 벗어남
예를 들어 a = [10, 20, 30] 이라는 원소 3개를 가진 리스트에서 print(a[4])와 같이 4번째 원소를 호출할 경우 발생하는 에러다.
IndexError: list index out of range 라고 범위를 벗어났다는 메시지가 뜰 거다.
ValueError : 참조 값이 없음
예를 들어 a = [10, 20, 30] 이라는 원소 3개를 가진 리스트에서 a.remove(40)과 같이 40이라는 값을 가진 원소를 지우려고 하면 발생하는 애초에 그런 값이 없기 때문에 에러가 발생한다.
ValueError: list.remove(x): x not in list 라고 그런 값이 리스트에 포함되어 있지 않다는 메시지가 뜬다.
KeyError : 키 없음 에러 (주로 딕셔너리 사용시)
mydict = {'Kim': 1, 'Lee': 2} 라는 딕셔너리가 있을 때 print(mydict['Park'])라고 출력하면 발생하는 에러다.
KeyError: 'Park' 라고 메시지가 뜬다.
이럴 땐 get 메소드를 활용하면 좋다. print(mydict.get('Park'))라고 써보면 None이 출력된다.
키가 없을 경우 None값이 반환되기도 하고, 그 뒤에 키가 없을 때 반환할 값을 지정해놓아도 된다.
이렇게 print(mydict.get('Park', 'unknown'))
AttributeError : 모듈, 클래스의 잘못된 속성 사용함
예를 들어 import time으로 time 모듈을 활용하고자 할 때 time.sleep()이라고 하면 에러가 안 나지만, time.month()라고 엉뚱한 함수를 사용하면 에러가 발생한다.
AttributeError: module 'time' has no attribute 'month'라고, time 모듈은 month라는 속성이 없다고 친절하게 알려준다.
FileNotFoundError : 파일 못 찾음
예를 들어 어떤 텍스트 파일을 읽기 위해 f= open('ex.txt', 'r')이라고 쳤을 때, 해당 경로에 파일이 없다면 FileNotFoundError: [Errno 2] No such file or directory: 'ex.txt' 라는 메시지가 뜬다. 그런 파일이나 디렉토리(폴더)가 없다는 뜻이다.
TypeError : 타입 안 맞음
a = [1,2] 라고 리스트를 만들어 놓고, b = “Hello”라고 문자열을 만든 뒤 둘을 더하기로 연결해보자.
print(a+b)라고 하면 TypeError: can only concatenate list (not "str") to list 라고 해서 리스트는 (문자열이 아닌) 리스트와 결합할 수 있습니다 라고 뜬다.
출처 : hleecaster.com/python-exception/
예외처리
try:
예외가 발생할 수 있는 코드
except:
예외가 발생했을때 실행할 코드 (생략 가능, 여러개 사용 가능)
else :
예외가 발생하지 않았을 때 실행할 코드(생략 가능)
finally:
예외 발생 여부와 상관없이 무조건 실행할 코드(생략가능)
위에서 설명한 에러 종류들을 직접 명시해서 except ValueError: , except NameError: 이런 식으로 써도 되지만, 어떤 에러가 발생할지 모르겠을 때는 최종적으로 except Exception: 이라고 해서 이런저런 에러를 무조건 다 잡아버릴 수도 있다. except Exception as e: 라고 쓰고 print(e)로 출력하면 에러 내용을 확인할 수도 있다.
예시
print("나눗기 전용 계산기 입니다.")
num1 = int(input("첫 번째 숫자를 입력하세요 : "))
num2 = int(input("두 번째 숫자를 입력하세요 : "))
print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
num2에 숫자값을 넣어줘야 하는데 문자를 넣어줘서 ValueError가 발생했다.
try ~ except문을 써서 예외처리를 해보면
try:
print("나눗기 전용 계산기 입니다.")
num1 = int(input("첫 번째 숫자를 입력하세요 : "))
num2 = int(input("두 번째 숫자를 입력하세요 : "))
print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
print("에러! 잘못된 값을 입력하였습니다!")
0으로 나눗셈을 진행하는 경우
print(10 / 0)
# ZeroDivisionError: division by zero
ZeroDivisionError 가 발생한다.
except ZeroDivisionError as err: 로 예외처리를 해주면,
try:
print("나눗기 전용 계산기 입니다.")
num1 = int(input("첫 번째 숫자를 입력하세요 : "))
num2 = int(input("두 번째 숫자를 입력하세요 : "))
print("{0} / {1} = {2}".format(num1, num2, int(num1 / num2)))
except ValueError:
print("에러! 잘못된 값을 입력하였습니다!")
except ZeroDivisionError as err:
print(err)
모든 에러에 대한 처리
try:
print("나눗기 전용 계산기 입니다.")
nums = []
nums.append(int(input("첫번째 숫자를 입력하세요 : ")))
nums.append(int(input("두번째 숫자를 입력하세요 : ")))
#실수로 입력하지 않았다! #nums.append(int(nums[0]/nums[1]))
print("{0} / {1} = {2}".format(nums[1], nums[2], nums[2]))
except ValueError:
print("에러! 잘못된 값을 입력하였습니다!")
except ZeroDivisionError as err:
print(err)
except Exception as err: #나머지 모든에러에 대한 처리
print("알 수 없는 에러가 발생하였습니다!")
print(err)
except Exception as err: 을 사용하여 위에서 작성하지 않은 다른 에러들을 한번에 처리한다.
finally 구문
try:
print("나눗기 전용 계산기 입니다.") nums = []
nums.append(int(input("첫번째 숫자를 입력하세요 : ")))
nums.append(int(input("두번째 숫자를 입력하세요 : ")))
#실수로 입력하지 않았다! #nums.append(int(nums[0]/nums[1]))
print("{0} / {1} = {2}".format(nums[1], nums[2], nums[2]))
except ValueError:
print("에러! 잘못된 값을 입력하였습니다!")
except ZeroDivisionError as err:
print(err)
except Exception as err: #나머지 모든에러에 대한 처리
print("알 수 없는 에러가 발생하였습니다!")
print(err)
finally:
print("계산기를 이용해 주셔서 감사합니다.")
finally는 결과와 상관없이 출력시켜주는 구문이다. (생락도 가능하다.)
raise - 직접 예외 발생시키기
try:
print("한 자리 숫자 나누기 전용 계산기 입니다.")
num1 = int(input("첫 번째 숫자를 입력하세요 : "))
num2 = int(input("두 번째 숫자를 입력하세요 : "))
if num1 >= 10 or num2 >= 10:
raise ValueError # 예외 발생시키기
print("{0}/{1}={2}".format(num1, num2, int(num1 / num2)))
except ValueError:
print("잘 못된 값을 입력하였습니다. 한 자리 숫자만 입력하세요.")
finally:
print("계산기를 이용해 주셔서 감사합니다.")
일부러 raise 키워드로 예외를 발생시켜 처리할 수도 있다.
위에서 입력값이 10을 넘어가면 ValueError를 발생시켜서 예외처리된 print문을 실행시켜준다.
'DL(Deep-Learning) > Python 기초' 카테고리의 다른 글
[Python] Raw String이란? (0) | 2022.01.26 |
---|---|
[Python] 파일과 디렉토리 경로 설정하기 (0) | 2022.01.26 |
[Python] 클래스 Class 2 (0) | 2022.01.26 |
[Python] 클래스 Class 1 (0) | 2022.01.26 |
[python] 함수 Function (0) | 2022.01.26 |