AI 그게 뭔데
끄적끄적 개발일지
AI 그게 뭔데
전체 방문자
오늘
어제
  • 분류 전체보기 (342)
    • 논문 (5)
    • DL(Deep-Learning) (34)
      • 개념 (14)
      • Python 기초 (14)
      • Tensorflow (6)
      • Pytorch (0)
    • NLP (10)
    • OpenCV (53)
    • DevOps (10)
      • AWS (2)
      • Docker & Kubernetes (4)
      • Spark (3)
      • SQL (1)
    • MacOS (1)
    • React-Native (2)
    • BI (3)
      • GA(Google Analytics) (3)
      • Tableau (0)
    • 알고리즘 (221)
      • 백준 (76)
      • 프로그래머스 (108)
      • 기타 알고리즘 (37)

인기 글

태그

  • OpenCV
  • LEVEL2
  • 알고리즘
  • 이코테
  • 파이썬
  • 프로그래머스
  • level1
  • Python
  • 연습문제
  • 백준

최근 글

hELLO · Designed By 정상우.
AI 그게 뭔데

끄적끄적 개발일지

[Python] 예외처리
DL(Deep-Learning)/Python 기초

[Python] 예외처리

2022. 1. 26. 21:45

파이썬 예외(에러)의 종류

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
    AI 그게 뭔데
    AI 그게 뭔데
    공부와 개발 그리고 AI가 약간 첨가된 흔적 남기기

    티스토리툴바