1. try except로 사용하기
예외 처리를 하려면 다음과 같이 try에 실행할 코드를 넣고 except에 예외가 발생했을 때 처리하는 코드를 넣습니다.
try:
실행할 코드
except:
예외가 발생했을 때 처리하는 코드
2. 특정 예외만 처리하기
이번에는 except에 예외 이름을 지정해서 특정 예외가 발생했을 때만 처리 코드를 실행하도록 만들어보겠습니다.
try:
실행할 코드
except 예외이름:
예외가 발생했을 때 처리하는 코드
try_except_exception.py
y = [10, 20, 30]
try:
index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
print(y[index] / x)
except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
print('숫자를 0으로 나눌 수 없습니다.')
except IndexError: # 범위를 벗어난 인덱스에 접근하여 에러가 발생했을 때 실행됨
print('잘못된 인덱스입니다.')
3. 예외의 에러 메시지 받아오기
특히 except에서 as 뒤에 변수를 지정하면 발생한 예외의 에러 메시지를 받아올 수 있습니다.
try:
실행할 코드
except 예외 as 변수:
예외가 발생했을 때 처리하는 코드
try_except_as.py
y = [10, 20, 30]
try:
index, x = map(int, input('인덱스와 나눌 숫자를 입력하세요: ').split())
print(y[index] / x)
except ZeroDivisionError as e: # as 뒤에 변수를 지정하면 에러를 받아옴
print('숫자를 0으로 나눌 수 없습니다.', e) # e에 저장된 에러 메시지 출력
except IndexError as e:
print('잘못된 인덱스입니다.', e)
모든 예외의 에러 메시지를 출력하고 싶다면 다음과 같이 except에 Exception을 지정하고 as 뒤에 변수를 넣으면 됩니다.
except Exception as e: # 모든 예외의 에러 메시지를 출력할 때는 Exception을 사용
print('예외가 발생했습니다.', e)
파이썬 예외 계층도
4. else와 finally 사용하기
try:
실행할 코드
except:
예외가 발생했을 때 처리하는 코드
else:
예외가 발생하지 않았을 때 실행할 코드
finally:
예외 발생 여부와 상관없이 항상 실행할 코드
try_except_else.py
try:
x = int(input('나눌 숫자를 입력하세요: '))
y = 10 / x
except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
print('숫자를 0으로 나눌 수 없습니다.')
else: # try의 코드에서 예외가 발생하지 않았을 때 실행됨
print(y)
try_except_else_finally.py
try:
x = int(input('나눌 숫자를 입력하세요: '))
y = 10 / x
except ZeroDivisionError: # 숫자를 0으로 나눠서 에러가 발생했을 때 실행됨
print('숫자를 0으로 나눌 수 없습니다.')
else: # try의 코드에서 예외가 발생하지 않았을 때 실행됨
print(y)
finally: # 예외 발생 여부와 상관없이 항상 실행됨
print('코드 실행이 끝났습니다.')
try는 함수가 아니므로 스택 프레임을 만들지 않습니다 따라서 try 안에서 변수를 만들더라도 try 바깥에서 사용할 수 있습니다. 물론 except, else, finally에서도 사용할 수 있습니다.
5. 예외 발생시키기
- raise 예외('에러메시지')
try_except_raise.py
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴
print(x)
except Exception as e: # 예외가 발생했을 때 실행됨
print('예외가 발생했습니다.', e)
6. raise의 처리 과정
try_except_function_raise.py
def three_multiple():
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴
print(x) # 현재 함수 안에는 except가 없으므로
# 예외를 상위 코드 블록으로 넘김
try:
three_multiple()
except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨
print('예외가 발생했습니다.', e)
소스 코드를 실행한 뒤 5를 입력하고 엔터 키를 누르세요.
실행 결과
3의 배수를 입력하세요: 5 (입력)
예외가 발생했습니다. 3의 배수가 아닙니다.
예외가 발생하더라도 현재 코드 블록에서 처리해줄 except가 없다면 except가 나올 때까지 계속 상위 코드 블록으로 올라갑니다.
만약 함수 바깥에도 처리해줄 except가 없다면 코드 실행은 중지되고 에러가 표시됩니다. 다음은 파이썬 셸에서 직접 three_multiple 함수를 호출했으므로 except가 없는 상태입니다.
>>> three_multiple()
3의 배수를 입력하세요: 5 (입력)
Traceback (most recent call last):
File "<pyshell#5>", line 1, in <module>
three_multiple()
File "C:\project\try_except_function_raise.py", line 4, in three_multiple
raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴
Exception: 3의 배수가 아닙니다.
7. 현재 예외를 다시 발생시키기
이번에는 try except에서 처리한 예외를 다시 발생시키는 방법입니다. except 안에서 raise를 사용하면 현재 예외를 다시 발생시킵니다(re-raise).
- raise
다음은 three_multiple 코드 블록의 예외를 다시 발생시킨 뒤 상위 코드 블록에서 예외를 처리합니다.
try_except_raise_in_except.py
def three_multiple():
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise Exception('3의 배수가 아닙니다.') # 예외를 발생시킴
print(x)
except Exception as e: # 함수 안에서 예외를 처리함
print('three_multiple 함수에서 예외가 발생했습니다.', e)
raise # raise로 현재 예외를 다시 발생시켜서 상위 코드 블록으로 넘김
try:
three_multiple()
except Exception as e: # 하위 코드 블록에서 예외가 발생해도 실행됨
print('스크립트 파일에서 예외가 발생했습니다.', e)
소스 코드를 실행한 뒤 5를 입력하고 엔터 키를 누르세요.
실행 결과
3의 배수를 입력하세요: 5 (입력)
three_multiple 함수에서 예외가 발생했습니다. 3의 배수가 아닙니다.
스크립트 파일에서 예외가 발생했습니다. 3의 배수가 아닙니다.
- raise 예외('에러메시지')
if x % 3 != 0:
raise Exception('3의 배수가 아닙니다.')
print(x)
except Exception as e:
print('three_multiple 함수에서 예외가 발생했습니다.', e)
raise RuntimeError('three_multiple 함수에서 예외가 발생했습니다.')
assert로 예외 발생시키기
예외를 발생시키는 방법 중에는 assert를 사용하는 방법도 있습니다. assert는 지정된 조건식이 거짓일 때 AssertionError 예외를 발생시키며 조건식이 참이면 그냥 넘어갑니다. 보통 assert는 나와서는 안 되는 조건을 검사할 때 사용합니다.
다음은 3의 배수가 아니면 예외 발생, 3의 배수이면 그냥 넘어갑니다.
assert 조건식
assert 조건식, 에러메시지
assertion.py
x = int(input('3의 배수를 입력하세요: '))
assert x % 3 == 0, '3의 배수가 아닙니다.' # 3의 배수가 아니면 예외 발생, 3의 배수이면 그냥 넘어감
print(x)
실행 결과
3의 배수를 입력하세요: 5 (입력)
Traceback (most recent call last):
File "C:\project\assertion.py", line 2, in <module>
assert x % 3 == 0, '3의 배수가 아닙니다.'
AssertionError: 3의 배수가 아닙니다.
assert는 디버깅 모드에서만 실행됩니다. 특히 파이썬은 기본적으로 디버깅 모드이며(__debug__의 값이 True)
assert가 실행되지 않게 하려면 python에 -O 옵션을 붙여서 실행합니다(영문 대문자 O).
python -O 스크립트파일.py
8. 예외 만들기
1)
class 예외이름(Exception):
def __init__(self):
super().__init__('에러메시지')
class NotThreeMultipleError(Exception): # Exception을 상속받아서 새로운 예외를 만듦
def __init__(self):
super().__init__('3의 배수가 아닙니다.')
def three_multiple():
try:
x = int(input('3의 배수를 입력하세요: '))
if x % 3 != 0: # x가 3의 배수가 아니면
raise NotThreeMultipleError # NotThreeMultipleError 예외를 발생시킴
print(x)
except Exception as e:
print('예외가 발생했습니다.', e)
three_multiple()
2)
class NotThreeMultipleError(Exception): # Exception만 상속받고
pass # 아무것도 구현하지 않음
raise NotThreeMultipleError('3의 배수가 아닙니다.') # 예외를 발생시킬 때 에러 메시지를 넣음
'BASIC' 카테고리의 다른 글
재귀호출 (0) | 2023.11.21 |
---|---|
함수 (1) | 2023.11.19 |
덕타이핑 / 믹스인 (1) | 2023.11.19 |
named tuple (0) | 2023.11.17 |
두점 사이 거리구하기 (0) | 2023.11.17 |
댓글