티스토리 뷰
1. 예외
- 프로그램 실행 중 발생할 수 있는 예상치 못한 문제 또는 오류 상황을 의미
- 예외가 발생하면 프로그램은 중단되기 때문에 이를 적절하게 처리하
중단을 방지하거나 오류에 대한 정보를 사용자에게 제공해야 함
print(10/3)
print(5/0) # 에러가 난 다음부터는 진행이 안됨
print(4/2)
# 프로그램에 오류가 나더라도 일단 넘기고, 다른 곳에 저장해두기 (로그 남긴다)
# 에러도 객체화시켜서 에러 메시지가 나오는 것
# 기본 형태
try:
# 예외가 발생할 가능성이 있는 코드
except ExceptionType1: # 'ExceptionType1'에는 실제 예외 유형이 들어갑니다.
# ExceptionType1 # 예외가 발생했을 때 실행될 코드
except ExceptionType2: # 'ExceptionType2'에는 다른 예외 유형이 들어갑니다.
# ExceptionType2 # 예외가 발생했을 때 실행될 코드
추가적인 except 블록을 계속 추가할 수 있습니다.
else:
# try 블록에서 예외가 발생하지 않았을 때 실행될 코드
finally:
# 예외 발생 여부와 관계없이 항상 실행될 코드
적용
# ZeroDivisionError 처리
try:
print(10/3)
print(5/0)
print(4/2) # 실행 x
except ZeroDivisionError:
print('0으로 나눌 수 없습니다')
print('프로그램을 종료합니다')
# 생략시 모든 에러 처리
try:
print(10/3)
print(5/0)
print(4/2) # 실행 x
except: # 모든 에러들을 상속해주는 부모 클래스
print('0으로 나눌 수 없습니다')
print('프로그램을 종료합니다')
# IndexError 처리
try:
data = [10, 20, 30, 40, 50]
print(data[0]) # 실행
print(data[5]) # 에러
print(data[3]) # 실행 x
except IndexError:
print('인덱스 지정이 올바르지 않습니다')
print('프로그램 종료')
except: vs. except Exception:
1. except:
- 모든 예외를 처리합니다. 예외 종류에 상관없이 예외가 발생하면 except 블록의 코드가 실행됩니다.
- 일반적인 예외 처리에 유용합니다. 예외 종류를 명시적으로 알 필요 없이 예외 상황에 대한 처리를 수행할 수 있습니다.
2. except Exception:
- except: 와 유사하지만 BaseException 의 하위 클래스인 모든 예외를 처리합니다.
- 대부분의 예외를 처리하지만, 내장 예외 외 사용자 정의 예외는 처리하지 못합니다.
1) 여러 종류 에러 처리
try:
data = [10, 20, 30, 40, 50]
print(data[0])
print(int('일')) # ValueError
print(5/0) # ZeroDivisionError
print(data[5])
print(data[3])
except IndexError:
print('인덱스 지정이 올바르지 않습니다')
except ZeroDivisionError:
print('0으로 나눌 수 없습니다')
except ValueError:
print('문자열을 정수로 변환했습니다')
except : # 모든 오류를 처리하므로 맨밑으로 내려가야함
print('오류를 모두 처리합니다') # 위에 쓰면 혼자 다 걸러버리게 됨
print('프로그램 종료')
2) as로 오류메시지 출력
try:
data = [10, 20, 30, 40, 50]
print(data[0])
# print(int('일')) # ValueError
# print(5/0) # ZeroDivisionError
print(data[5]) # IndexError
print(data[3])
except IndexError as e:
print(e)
except ZeroDivisionError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e: # exception 클래스가 상위에 있음, 생략 가능
print(e)
print('프로그램 종료')
3) else문과 finally문 추가
try:
data = [10, 20, 30, 40, 50]
print(data[0])
# print(int('일')) # ValueError
# print(5/0) # ZeroDivisionError
print(data[5]) # IndexError
print(data[3])
except IndexError as e:
print(e)
except ZeroDivisionError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e: # exception 클래스가 상위에 있음, 생략 가능
print(e)
else:
print('정상적인 프로그램 진행')
finally:
print('오류에 관계없이 무조건 실행되는 문장')
print('프로그램 종료')
2. Exception 클래스
- 파이썬의 내장 예외 계층 구조에서 거의 모든 내장 예외의 기본 클래스
- 사용자 정의 예외를 만들거나 특정 예외 유형을 잡기 위한 기본적인 인터페이스를 제공합니다.
- 상속: 예외 유형은 Exception을 상속받아서 정의됩니다. 예를 들면 ValueError, TypeError, FileNotFoundError 등이 있습니다. 이 상속 구조 덕분에 except Exception 블록은 Exception을 상속받은 모든 예외를 캡처할 수 있습니다.
- 메시지: 예외가 생성될 때, 일반적으로 오류 메시지를 함께 전달할 수 있습니다. 이 메시지는 예외 객체의 args 속성을 통해 접근 가능하며, 예외를 문자열로 변환할 때(예: str(e)) 해당 메시지가 반환됩니다.
# 직접 예외 만들기
try :
raise Exception('에러가 발생했어요') # 에러 직접 발생
except Exception as e:
print(e) # 결과 : 에러가 발생했어요
def func1():
n = int(input('짝수를 입력하세요 : '))
if n%2 != 0:
raise Exception('짝수가 아닙니다')
print(n) # 결과 : Exception: 짝수가 아닙니다
try:
func1()
except Exception as e:
print('예외가 발생 :', e) # 결과 : 예외가 발생 : 짝수가 아닙니다
def func1():
func2()
def func2():
func3()
def func3():
try:
print('%d' % '문자열 출력')
except TypeError:
print('타입이 올바르지 않습니다!')
func1()
# 방법 1
try:
func1()
except TypeError:
print('타입이 올바르지 않습니다')
# 방법 2
def func1():
try:
func2()
except TypeError:
print('타입이 올바르지 않습니다')
def func2():
func3()
def func3():
print('%d' % '문자열')
func1()
# 방법 3
def func1():
func2()
def func2():
try:
func3()
except TypeError:
print('타입이 올바르지 않습니다')
def func3():
print('%d' % '문자열')
func1()
# 방법 4
def func1():
func2()
def func2():
func3()
def func3():
try:
print('%d' % '문자열')
except TypeError:
print('타입이 올바르지 않습니다')
func1()
func1()이 맨밑에 깔리고, 그 위로 func2(), 그 위로 func3()가 쌓이는 식
실행할 땐 func3() -> func2() -> func1()
func3()에서 에러가 나면 func2()가 수습하고 그 다음으로 func1()가 수습
3. 사용자 정의 예외 클래스를 직접 만들고 활용하기
class AgeLimitError(Exception): # 모든 오류가 들어있는 Exception 클래스 상속받기
def __init__(self, age, message = '원하는 나이 범위가 아님'): # message 기본값 설정
self.age = age
self.message = message
super().__init__(message) # 상위 클래스인 Exception에 message를 보낸다
# 조건에 맞으면 raise를 통해 에러를 발생
def check_age(age):
if age < 20:
raise AgeLimitError(age, '나이 범위보다 어림')
elif age > 50:
raise AgeLimitError(age, '나이 범위보다 큼')
else :
return '나이 범위 안에 포함'
ages = [17, 26, 36, 60, 59, 48, 40]
for age in ages:
try:
print(check_age(age))
except AgeLimitError as e:
print(f'Error for age {e.age}: {e}')
( 결과 )
Error for age 17: 나이 범위보다 어림
나이 범위 안에 포함
나이 범위 안에 포함
Error for age 60: 나이 범위보다 큼
Error for age 59: 나이 범위보다 큼
나이 범위 안에 포함
나이 범위 안에 포함
'Python' 카테고리의 다른 글
20. 파이썬의 모듈 (0) | 2024.03.21 |
---|---|
19. (과제3) 주민등록번호 유효성 검사 (0) | 2024.03.21 |
17. 파이썬의 스페셜 메서드 (0) | 2024.03.19 |
16. 파이썬의 상속 (0) | 2024.03.19 |
15. 파이썬의 클로저와 데코레이터 (0) | 2024.03.19 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 줄 간격
- animation적용
- EPL정보프로그램
- 고정위치
- 클래스문
- Python
- DB프로그램만들기
- 변수
- MySQL
- Enclosing
- MySQLdb
- 솔로의식탁
- 셋
- DB단어장
- 절대위치
- __call__
- 폼
- 파이썬SQL연동
- html이론
- HTML
- 로또번호생성
- 상대위치
- 출력
- trasform
- 박스사이징
- FOR
- CSS
- JavaScript
- 리스트
- 닷홈
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함