본문 바로가기
Python

Python - Exception

by DGK 2021. 10. 18.

 

인프런 파이썬 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

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

댓글