본문 바로가기
AI 공부/파이썬

파이썬 (예외 처리)

by AI Sonny 2022. 8. 8.
728x90

파이썬의 예외는 대표적으로 구문적오류, 실행 오류, 의미적오류가 있다.

 

구문적 오류(Syntax Error)

  • 문법 오류에 의하여 기계어 변환 과정에서 발생하는 오류
  • 우리가 코딩을 하면서 가장 많이 보는 오류이다.

 

실행 오류(Runtime Error)

  • 프로그램 실행 중 발생하여 프로그램이 비정상적으로 종료되는 오류

 

예시

 

def do_func(text):
    return int(text)
text = "3"
do_func(text)

text = "3.0"
do_func(text)

=>	---------------------------------------------------------------------------
	ValueError                                Traceback (most recent call last)
	<ipython-input-4-7ac4698e8a41> in <module>()
	      1 text = "3.0"
	----> 2 do_func(text)
	
	<ipython-input-2-6568bb3cdae9> in do_func(text)
	      1 def do_func(text):
	----> 2     return int(text)
	      3 text = "3"
	      4 do_func(text)
	
	ValueError: invalid literal for int() with base 10: '3.0'

 


의미적 오류(Semantic Error)

  • 문법은 정상이지만 실행의 결과가 원하는대로 나오지 않는 오류
  • 오류가 대부분 개념이 부족한 상태에서 나타나기 때문에 해결하기 어렵다.

 

예시

 

a = (2)
b = (2,)

a == b

이 외의 오류

IndexError

  • 리스트의 인덱스 범위를 넘어갈 때 발생한다.

 

예시

 

a = [1,2,3]
a[5]

=>	---------------------------------------------------------------------------
	IndexError                                Traceback (most recent call last)
	<ipython-input-25-4a30d506aea3> in <module>()
	      1 a = [1,2,3]
	----> 2 a[5]

	IndexError: list index out of range

NameError

  • 정의되지 않은 변수를 사용하려 할 때

 

예시

 

karns

=>	---------------------------------------------------------------------------
	NameError                                 Traceback (most recent call last)
	<ipython-input-26-abc70f1e7fd0> in <module>()
	----> 1 karns

	NameError: name 'karns' is not defined

 

 

ValueError

  • 변환할 수 없는 자료형 변환을 시도할 때

 

예시

 

a = "손용석"
int(a)

=>	---------------------------------------------------------------------------
	ValueError                                Traceback (most recent call last)
	<ipython-input-27-5fd6ca0c2eeb> in <module>()
	      1 a = "손용석"
	----> 2 int(a)

	ValueError: invalid literal for int() with base 10: '손용석'

 

TypeError

  • 자료형이 맞지 않는 연산을 시도할 때
  • 호출할 수 없는 객체를 함수처럼 호출할 때

 

예시

 

20 / "용석"

=>	---------------------------------------------------------------------------
	TypeError                                 Traceback (most recent call last)
	<ipython-input-28-7912ca9486b6> in <module>()
	----> 1 20 / "용석"

	TypeError: unsupported operand type(s) for /: 'int' and 'str'

 

FileNotFoundError

  • 없는 파일을 읽어드리려 할 때

 

예시

 

open("text.txt") 

=>	---------------------------------------------------------------------------
	FileNotFoundError                         Traceback (most recent call last)
	<ipython-input-31-8b2bb8f17573> in <module>()
	----> 1 open("text.txt")

	FileNotFoundError: [Errno 2] No such file or directory: 'text.txt'

 

AttributeError

  • 객체의 없는 속성을 사용하려 할 때

 

예시

 

class MyClass:
    def do_func(self):
        self.a = self.a +2

mc = MyClass()
mc.do_func()

=>	---------------------------------------------------------------------------
	AttributeError                            Traceback (most recent call last)
	<ipython-input-33-f978a234de23> in <module>()
	      4 
	      5 mc = MyClass()
	----> 6 mc.do_func()

	<ipython-input-33-f978a234de23> in do_func(self)
	      1 class MyClass:
	      2     def do_func(self):
	----> 3         self.a = self.a +2
	      4 
	      5 mc = MyClass()

	AttributeError: 'MyClass' object has no attribute 'a'

 


 

예외처리

  • 프로그램 개발하면서 예상치 못한 상황 발생 시 처리
  • 입출력 오류와 같은 상황 발생 시 프로그램 종료를 방지하기 위함
  • 개발자가 예외 발생 가능한 부분을 어떻게 대응하라고 지정해줄 수 있다.

 

예시

 

try:
    예외 발생 가능성이 있는 실행 코드
except:
    예외 발생 시 실행 코드
else:
    예외 발생하지 않았을 경우 실행 코드
finally:
    예외 발생 여부와 상관없이 항상 실행할 코드

 

적용 예시

 

다음과 같이 에러가 발생할 시 문구를 넣을 수 있다. 또한 에러를 지정해서 메세지를 볼 수 있다.

 

lst = ["3","5","3.","3.0","10"]
num_list = []
for i in lst:
    try:
       num = int(i)
    except ValueError as e:
        print("정수형으로 변환되지 않습니다. 실수형으로 변환 후에 시도하겠습니다.")
        num_list.append(int(float(i)))
    else:
        print("정상적으로 정수형으로 변경합니다.")
    finally:
        num_list.append(num)
        print("정수형으로 변환 및 저장완료")

num_list

=>	정상적으로 정수형으로 변경합니다.
	정수형으로 변환 및 저장완료
	정상적으로 정수형으로 변경합니다.
	정수형으로 변환 및 저장완료
	정수형으로 변환되지 않습니다. 실수형으로 변환 후에 시도하겠습니다.
	정수형으로 변환 및 저장완료
	정수형으로 변환되지 않습니다. 실수형으로 변환 후에 시도하겠습니다.
	정수형으로 변환 및 저장완료
	정상적으로 정수형으로 변경합니다.
	정수형으로 변환 및 저장완료
	[3, 5, 3, 5, 3, 5, 10]

 

raise 문

  • 필요할 때 에러를 발생시키는 코드
  • if문과 함께 많이 사용된다.

 

예시

 

num = 0
if num == 0:
    raise ValueError("0으로 나눌 수 없어요.")
    
=>	---------------------------------------------------------------------------
	ValueError                                Traceback (most recent call last)
	<ipython-input-68-3b5a3a90e83c> in <module>()
	      1 num = 0
	      2 if num == 0:
	----> 3     raise ValueError("0으로 나눌 수 없어요.")

	ValueError: 0으로 나눌 수 없어요.

 

assert 문

  • 조건이 거짓일 경우 오류를 발생시킴

 

예시

 

def sol(n1,n2):     # 개발 단계에서 사용!
    assert n2 > 0, "1 이상의 정수만 입력하세요."
    return int(n1/n2)
sol(1,-1)

=>	---------------------------------------------------------------------------
	AssertionError                            Traceback (most recent call last)
	<ipython-input-83-a8a716634e95> in <module>()
	      2     assert n2 > 0, "1 이상의 정수만 입력하세요."
	      3     return int(n1/n2)
	----> 4 sol(1,-1)

	<ipython-input-83-a8a716634e95> in sol(n1, n2)
	      1 def sol(n1,n2):
	----> 2     assert n2 > 0, "1 이상의 정수만 입력하세요."
	      3     return int(n1/n2)
	      4 sol(1,-1)

	AssertionError: 1 이상의 정수만 입력하세요.
728x90

댓글