1. 예외
예외(Exception)는 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미합니다. 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하여 중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 합니다.
2. 예외가 발생하는 경우
- ValueError
- 잘못된 값을 함수나 연산에 제공할 때 발생합니다.
- 예) 숫자가 아닌 문자열을 int() 함수로 변환하려고 할 때 발생.
- TypeError
- 올바르지 않은 유형의 객체를 연산에 사용하려 할 때 발생합니다.
- 예) 문자열과 숫자를 함께 더하려고 할 때 발생.
- ZeroDivisionError
- 숫자를 0으로 나누려고 할 때 발생합니다.
- IndexError
- 리스트, 튜플, 문자열 등의 시퀀스 유형에서 범위를 벗어난 인덱스에 접근하려 할 때 발생합니다.
- 예) 길이가 3인 리스트에 대해 4번째 요소에 접근하려고 할 때 발생.
- KeyError
- 딕셔너리에서 존재하지 않는 키를 사용하여 값을 검색하려고 할 때 발생합니다.
- AttributeError
- 객체에 없는 속성이나 메서드에 접근하려고 할 때 발생합니다.
- FileNotFoundError
- 존재하지 않는 파일을 열려고 할 때 발생합니다.
- ImportError
- 존재하지 않는 모듈을 가져오려고 할 때 또는 모듈 내에 해당 속성/함수가 없을 때 발생합니다.
- NameError
- 정의되지 않은 변수나 함수를 사용하려고 할 때 발생합니다.
- 예) 프로그램에서 정의되지 않은 변수 x를 사용하려고 할 때 발생.
- OverflowError
- 수치 연산 결과가 너무 커서 표현할 수 없을 때 발생합니다.
- MemoryError
- 프로그램이 사용 가능한 모든 메모리를 소진했을 때 발생합니다.
3. 예외 처리 기본 구조
try:
# 예외가 발생할 가능성이 있는 코드
except ExceptionType1: # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
# ExceptionType1 예외가 발생했을 때 실행될 코드
except ExceptionType2: # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
# ExceptionType2 예외가 발생했을 때 실행될 코드
# 추가적인 except 블록을 계속 추가할 수 있습니다.
else:
# try 블록에서 예외가 발생하지 않았을 때 실행될 코드
finally:
# 예외 발생 여부와 관계없이 항상 실행될 코드
예시1)
# 에러코드 확인
print(10 / 3)
print(5 / 0)
print(4 / 2)
3.3333333333333335
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
<ipython-input-1-9c5e3ff0ad94> in <cell line: 2>()
1 print(10 / 3)
----> 2 print(5 / 0)
3 print(4 / 2)
ZeroDivisionError: division by zero
# 특정 예외 처리
try:
print(10 / 3)
print(5 / 0) #ZeroDivisionError: division by zero
print(4 / 2)
except ZeroDivisionError :
print('0으로 나눌 수 없습니다.')
print('프로그램 종료')
# 모든 예외처리
try:
print(10 / 3)
print(5 / 0)
print(4 / 2)
except :
print('0으로 나눌 수 없습니다.')
print('프로그램 종료')
예시2)
# 에러 코드 확인
data = [10, 20, 30, 40, 50]
print(data[5])
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-4-879de49a30d4> in <cell line: 2>()
1 data = [10, 20, 30, 40, 50]
----> 2 print(data[5])
IndexError: list index out of range
# 모든 예외 처리
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(data[5])
print(data[3]) #IndexError: list index out of range
except:
print('인덱스 지정 잘못됨')
print('종료')
# 특정 예외 처리
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(data[5])
print(data[3]) #IndexError: list index out of range
except IndexError:
print('인덱스 지정 잘못됨')
print('종료')
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(int('일'))
print(5/0)
print(data[5])
print()
print(data[3]) #IndexError: list index out of range
except IndexError :
print('인덱스 지정 잘못됨')
except ZeroDivisionError:
print('0으로 나눌 수 없음')
except: # 전체예외처리는 마지막에 써야함
print('오류처리')
print('종료')
- except:만 사용: 하면 프로그램 종료나 키보드 중단과 같은 특수한 예외까지 처리할 수 있지만, 대부분의 상황에서 이렇게 예외 처리는 권장되지 않습니다.
- except Exception as e:는 일반적인 예외만 처리하면서, 발생한 예외의 상세 정보에 접근할 수 있는 능력을 제공합니다. 이 형태를 사용하면 더 명시적이며 예외 처리가 더 예측 가능해집니다.
# 예외 에러 메세지 받기
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(5/0)
print(data[5])
print(data[3]) #IndexError: list index out of range
except IndexError as e:
print(e)
except ZeroDivisionError as e:
print(e)
except Exception as e: # 전체예외처리는 마지막에 써야함
print(e)
print('종료')
# 예외가 발생하지 않았을 경우
try:
data = [10, 20, 30, 40, 50]
string = '오늘은 즐거운 예외처리 시간!'
print(10 / 3)
print(4 / 2)
except ZeroDivisionError as e:
print('0으로 나눌 수 없습니다', e)
except IndexError as e:
print('인덱스 지정이 올바르지 않습니다', e)
except TypeError as e:
print('데이터 타입이 올바르지 않습니다', e)
else:
print('정상적인 프로그램 진행')
print('프로그램을 종료합니다')
# 예외 발생 여부와 관계없이 실행하기
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(5/0)
print(data[5])
print(data[3]) #IndexError: list index out of range
except IndexError as e:
print(e)
except ZeroDivisionError as e:
print(e)
except Exception as e: # 전체예외처리는 마지막에 써야함
print(e)
else:
print('정상적인 프로그램 실행')
finally:
print('오류에 관계없이 무조건 실행되는 문장')
print('종료')
4. Exception 클래스
Exception 클래스는 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스입니다. 이 클래스는 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.
- 상속: 예외 유형은 Exception을 상속받아서 정의됩니다. 예를 들면 ValueError, TypeError, FileNotFoundError 등이 있습니다. 이 상속 구조 덕분에 except Exception 블록은 Exception을 상속받은 모든 예외를 캡처할 수 있습니다.
- 메시지: 예외가 생성될 때, 일반적으로 오류 메시지를 함께 전달할 수 있습니다. 이 메시지는 예외 객체의 args 속성을 통해 접근 가능하며, 예외를 문자열로 변환할 때(예: str(e)) 해당 메시지가 반환됩니다.
try:
raise Exception('에러가 발생') # raise 에러를 내는 코드
except Exception as e:
print(e)
def func1():
n = int(input('짝수 입력 : '))
if n % 2 != 0:
raise Exception('짝수가 아닙니다.') # raise를 통해서 에러가 발생하게 만듬
print(n)
try:
func1()
except Exception as e:
print('예외가 발생했습니다.')
def func1():
func2()
def func2():
func3()
def func3():
try:
print('%d' % '문자열 출력')
except TypeError:
print('타입이 올바르지 않음')
func1()
# 리턴받기 전까지만 오류처리를 해주면됨
5. 사용자 정의 예외 클래스를 직접 만들고 활용하기
class AgeLimitError(Exception):
def __init__(self, age, message ='원하는 나이 범위가 아님~'):
self.age = age
super().__init__(message) # 부모클래스 생성자에 메세지전달
def check_age(age):
if age < 20:
raise AgeLimitError(age, '어림')
elif age > 40:
raise AgeLimitError(age ,'늙음')
else:
return('적당')
ages = [17, 25, 43, 19]
for age in ages:
try:
print(check_age(age))
except AgeLimitError as e:
print(f"Error for age {e.age}: {e}")
'기초 및 언어 > ▶ python' 카테고리의 다른 글
| 20_Python 변수 타입 어노테이션 (0) | 2023.12.13 |
|---|---|
| 19_Python 파이썬 모듈 (0) | 2023.12.13 |
| 17_Python 스페셜 메서드 (언더스코어 __init__, ... 등 ) (0) | 2023.12.12 |
| 16_Python 파이썬 상속 (0) | 2023.12.12 |
| 15_Python 객체지향과 클래스 (1) | 2023.12.11 |