Networks/Python

SK networks AI Camp - 오류(Exception)와 예외처리

코딩하는 Español되기 2024. 7. 14. 08:00
코딩하면서 오류는 반가운 친구입니다.
(이렇게 쓰니까 뭔가 있어보이네요)
- 블로그 주인 -

왜냐하면 오류를 보면 제가 틀린 부분을 잘 알 수 있거든요.

(하지만 안 보고 싶어요. 그래서 코딩하는 사람들은 외향인이 많나봐요... 저 포함)

java를 하다가 python을 하니까 느낀 점이

오류를 알려주는 게 너무 친절해서 좋았어요.

java가 외강내강인 으르르릉 치와와 같은 느낌이면
python은 외약내약(?)인 온순한 푸들 같은 느낌이죠
- 블로그 주인 -

 

하여튼 오류는 아래의 사진과 같이 구성되어 있어요.

왜 이 사진들을 알아야 하냐고 물으실 수 있는데

오류에 대해 알아보고 그 이유를 알려드릴게요.

오류 종류

1. ValueError

부적절한 값을 인자로 받은 경우

int('abc')	   # <---- Value error
lst = ['a', 'b', 'c']
lst.index('z') # <---- Value error

2. IndexError

인덱스 범위를 벗어나는 경우. (길이를 아는 함수는? len()을 사용하여 오류를 해결할 수 있어요.)

lst = [1,2,3,4,5]
lst[10]			# <--- lst의 인덱스 범위는 4까지

tup = tuple(['a','b','c'])
tup[5]			# <--- tup의 인덱스 범위는 2까지

3. SyntaxError

파이썬 문법오류가 발생하는 경우. 이 경우 찾기 쉬워요.

a = 1

if a ==2
	# : 가 빠졌죠?
	print('1111')
    
fi a == 2:
	# fi -> if
	print('1111')

4. NameError

변수 이름을 찾을 수 없는 경우. 주로 대문자 소문자, 오타 등으로 자주 발생해요.

if tt == 1:
	print('1111')

5. ZeroDivisionError

0으로 나누려는 경우

10 / 0

6.FileNotFoundError

해당 파일이나 디렉터리가 없는 경우

open('test.py', 'r')

7. TypeError

잘못된 타입 전달

1 + '11'

8. AttributeError

Attribute(속성)을 참조 또는 대입이 실패한 경우

lst = [1,2,3,4,5]

lst.appe(1) # appe라는 속성은 없어요

9. KeyError

딕셔너리에서 접근하려는 키 값이 없는 경우

dic = {'a' : 1, 'b' : 2, 'c' : 3}
dic['z']


예외처리

○ try/except 구조

try:
	# 로직, 기능
except <오류종류>:
	# try문에서 Exception(오류)가 발생할 때, 실행됨

○ 예시

try:
	x = int('11')
    print(x)
except ValueError as e:
	print(f'오류 메세지: {e}')
# 결과 11


try:
	x = int('abc')
    print(x)
except ValueError as e:
	print(f'오류 메세지 : {e}')
    
# 결과 오류메세지 : invalid literal for int() with base 10 : 'abc'


else/finally

○ 구조

try:
	# 로직, 기능
except <오류종류>:
	# try문에서 오류가 발생할 때, 실행
else:
	# try문이 성공할 때 발생
finally:
	# try문 결과에 상관없이 실행

○ 예시

try:
    x = 11+ int('22')
    print(x)
except:
    print('except ~~')

try:
    x = 11+ int('22')
    print(x)
except:
    print('except ~~')
finally:
    print('finally ~~')

try:
    x = 11+ int('22')
    print(x)
except:
    print('except ~~')
else:
    print('else ~~')
finally:
    print('finally ~~')

try:
    x = 11+ int('abc')
    print(x)
except:
    print('except ~~')
else:
    print('else ~~')
finally:
    print('finally ~~')


아까 설명했던 오류 종류의 구조를 어느 정도 알아야 하는 이유?

예외를 아래의 코드와 같이 여러개 적어줄 수 있어요. 하지만 AttributeError보다 상위에 있는 Execption을 위에 적어주면

아래의 'AE'는 출력이 되지 않아요. 순서를 바꿔주면 AttributeError가 발생하면 'AE'가 출력이 가능해요

try:
    lst = [1,2,3,4,5]
    lst.appe('z')
except Exception as e:
    print('Exception')
except AttributeError as Ae:
    print('AE')

앞에 포스팅이 너무 길어서 따로 포스팅 했네요. 다음 번에 또 봐요!